之前提到过使用cloudflare的电子邮件路由,根据向导能自动创建身份验证记录,但是仅针对通过cloudflare的邮件路由服务来发送的邮件有效,如果你在自己的服务器上直接发送邮件,需要修改记录通过SPF、DMARC与DKIM验证。

SPF

        域名DNS记录,用于指定哪些邮件服务器有权代表域名发送邮件,记录名为example.com或子域名。SPF的匹配过程是从前往后依次检查,一旦匹配到某个机制并确定结果,就不会继续检查后面的机制。主要记录为"v=spf1 [<修饰符><指令>:<参数>]",多个完整记录之间空格隔开。

  1. v=spf1:版本号,表示这是SPF版本1
  2. 修饰符:指定指令的行为

    • +:允许发送邮件,接受邮件标记为可信,默认
    • -:拒绝发送邮件,拒绝邮件可能直接丢弃或退回
    • ~:软拒绝发送邮件,接受邮件,但可能放入垃圾邮件或标记为可疑
    • ?:不明确表态,通常接受邮件,不做特别处理
  3. 指令:指定该记录的操作

    • a:允许域名解析到的IP,默认解析SPF记录对应域名,后可跟其他域名,消耗一次A/AAAA记录解析
    • mx:允许MX记录的IP发送邮件(MX记录是邮件接收过程中决定哪个服务器接收邮件)
    • ip4:允许指定的IPv4地址或网段发送邮件
    • ip6:允许指定的IPv6地址或网段发送邮件
    • include:引入其他域名的SPF记录,消耗一次SPF查询
    • all:所有

        因为最简化,该服务器postfix只用于发送,不用于接收,无论是外域邮件的接收,还是自建邮件的转发接收,不需要调整postfix相关配置。

DKIM

        域名DNS记录,邮件发送方基于邮件的部分内容使用私钥进行数字签名,附加到邮件头部,接收方使用公钥验证邮件是否篡改。Postfix的核心职责是处理邮件的传输,签名需要其他软件配合,本例使用OpenDKIM,默认生成RSA密钥加密和SHA-256哈希算法签名。

  1. 安装OpenDKIM:yum install opendkim opendkim-tools -y
  2. 生成DKIM密钥:单独存放,否则启动时会因为权限问题导致无法启动,mkdir -p /etc/opendkim/example.com && cd /etc/opendkim/example.com,生成密钥命令opendkim-genkey`,有参数如下

    • -d + 域名:指定DKIM签名使用的域名,即邮件From头部的域名
    • -s + 标识名:在记录中名称为<标识名._domainkey>,用以区分不同密钥
    • -b + 1024/2048:指定密钥位数,默认2048
    • -t:生成测试密钥
  3. 限定权限:groupadd opendkim && useradd -r -g opendkim -s /sbin/nologin opendkimchown -R opendkim:opendkim /etc/opendkim/example.com && chmod 600 /etc/opendkim/example.com/default.private
  4. 添加DKIM记录:执行后生成标识名.private的私钥和标识名.txt的公钥,打开txt文本复制引号内容,添加DNS记录
  5. 配置OpenDKIM:复制备份并编辑配置文件/etc/opendkim.conf

    # 日志
    Syslog    yes
    SyslogSuccess    yes
    LogWhy    yes
    
    # 用户和权限
    UserID    opendkim:opendkim
    Umask    002
    
    # 通信
    Socket inet:8891@localhost
    PidFile    /run/opendkim/opendkim.pid
    
    # 签名
    OversignHeaders    From,Subject,Date,To #强制签名部分字段
    Canonicalization    relaxed/relaxed #签发和验证时规范化空格、换行符等
    Mode s #s仅发送时添加签名,v仅接收时验证签名
    
    # 指定密钥和映射文件
    Domain    example.com #指定域名生成签名
    KeyFile    /opendkim/default.private #指定私钥路径
    Selector    default #指定选择器
  6. 配置Postfix:编辑/etc/postfix/main.cf,文件末尾加上

    milter_default_action = accept
    milter_protocol = 6
    smtpd_milters = inet:127.0.0.1:8891
    non_smtpd_milters = inet:127.0.0.1:8891
  7. 重启OpenDKIM与Postfix:systemctl restart opendkim && systemctl enable opendkim && systemctl restart postfix
  8. 使用PostfixAdmin登录管理员账户,向测试网站发送测试邮件https://www.mail-tester.com/https://dkimvalidator.com/

DMARC

        域名DNS记录,用于接收方处理未通过SPF或DKIM验证的邮件,记录名为_dmarc.example.com或 _dmarc.子域名。主要记录为"v=DMARC1;p=策略;sp=策略;pct=百分比;rua=mailto:聚合报告邮箱;ruf=mailto:取证报告邮箱;fo=取证报告生成控制;adkim=DKIM策略;aspf=SPF策略"

  1. v=DMARC1:版本号,表示这是DMARC版本1
  2. p=策略:

    • none:邮件照常投递,但接收方会将认证结果反馈给域名所有者
    • quarantine:邮件被标记为可疑,可能会被投递到垃圾邮件文件夹
    • reject:邮件被直接拒绝,发送方会收到退信通知
  3. sp=策略:子域名策略,当子域名未单独配置时生效,与p参数相同
  4. pct=百分比:0-100,有多大的概率应用策略处理未通过的邮件

    • pct=0:不会对任何邮件应用策略,等价于p=none
    • pct=100:对所有未通过验证的邮件强制应用DMARC策略,默认
  5. rua=mailto:聚合报告邮箱:指定接收DMARC聚合报告的邮箱,报告为XML格式,仅包含统计数据,每日或定期统计数据汇总,显示验证通过/失败比例
  6. ruf=mailto:取证报告邮箱:指定接收未通过DMARC验证的具体邮件样本和详细信息的邮箱,每封未通过验证的邮件都会触发
  7. fo=取证报告生成频率:

    • fo=0:仅在SPF和DKIM都失败,且不通过DMARC(域名对齐或p=none)时生成取证报告,默认
    • fo=1:任何一次SPF或DKIM失败都会生成取证报告
    • fo=d:DKIM失败时生成取证报告
    • fo=s:SPF失败时生成取证报告
  8. adkim=DKIM策略:控制DKIM认证过程中,发件人域名与认证域名DKIM签名域之间的匹配严格程度

    • adkim=r:宽松,允许DKIM签名域与邮件头部域名对其,例如子域名与主域名匹配,默认
    • adkim=s:严格,须完全匹配域名,子域不被接受
  9. aspf=SPF策略:控制SPF认证过程中,发件人域名与认证域名SPF的Return-Path域之间的匹配严格程度,发件人为FROM,实际发件人为Return-Path,若中转则可能不一致

    • adkim=r:宽松,支持子域名与主域名匹配,默认
    • adkim=s:严格,须完全匹配域名,子域不被接受

        全部设置完成后,可以向Gmail邮箱发送邮件,点击接收邮件的显示原始邮件,如下内容则配置完成,对于一些要求不严格的例如qq邮箱已经能正常放入收件箱了,但对于严格的还是会放入垃圾信箱,如果还需更进一步,就需要配置反向DNS解析了……

mail_10