You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下Apache+Postfix环境PHP mail()无法发送邮件至Gmail

解决Gmail将Postfix发送的邮件判定为垃圾邮件的方案

以下是针对你的问题的具体解决步骤,按优先级排序:

1. 配置SPF记录

在你的域名DNS管理中添加一条TXT类型记录,授权服务器IP发送该域名的邮件:

v=spf1 ip4:你的服务器公网IP -all
  • 将ip4:后的内容替换为Ubuntu服务器的实际公网IP
  • -all表示仅允许记录中指定的IP发送该域名邮件,严格验证发件合法性

2. 设置DKIM签名

DKIM会给邮件添加数字签名,让Gmail确认邮件未被篡改且来自合法域名:

  • 安装opendkim工具:
    sudo apt install opendkim opendkim-tools
    
  • 修改opendkim主配置文件/etc/opendkim.conf,确保以下项正确:
    Domain                  example.org
    KeyFile                 /etc/opendkim/keys/example.org/private.key
    Selector                mail
    AutoRestart             Yes
    Syslog                  Yes
    UserID                  opendkim:opendkim
    Socket                  inet:8891@localhost
    
  • 生成DKIM密钥对:
    sudo mkdir -p /etc/opendkim/keys/example.org
    sudo opendkim-genkey -d example.org -s mail -D /etc/opendkim/keys/example.org
    sudo chown -R opendkim:opendkim /etc/opendkim/keys
    
  • 将生成的公钥(mail.txt文件内容)添加到域名DNS的TXT记录中,记录名为mail._domainkey.example.org
  • 修改Postfix配置/etc/postfix/main.cf,关联opendkim:
    milter_protocol = 6
    milter_default_action = accept
    smtpd_milters = inet:localhost:8891
    non_smtpd_milters = inet:localhost:8891
    
  • 重启服务生效:
    sudo systemctl restart postfix opendkim
    

3. 配置DMARC记录

在域名DNS中添加TXT记录,规范邮件验证失败后的处理逻辑:

v=DMARC1; p=none; sp=none; rua=mailto:dmarc@example.org
  • p=none表示先收集验证失败数据,不直接拦截,后续可改为p=quarantine(放入垃圾邮件)或p=reject(直接拒收)
  • rua指定接收DMARC报告的邮箱,需确保该邮箱真实存在

4. 优化邮件内容与头部

  • 发件人地址:确保no-reply@example.org是真实存在的邮箱(无需监控,但需能接收退信)
  • 邮件主题:替换当前模糊的"subject"为具体内容,比如"请验证你的example.org账户"
  • 邮件内容:
    • 加入个性化信息(如用户名、部分邮箱地址),避免所有邮件内容完全一致
    • 添加明确提示,比如"如果这不是你发起的操作,请忽略此邮件"
    • 确保HTML格式规范,实际代码中直接使用<html>等标签(无需转义)
  • 头部格式:使用PHP_EOL作为换行符,避免格式错误:
    $header  = "MIME-Version: 1.0" . PHP_EOL;
    $header .= "Content-type: text/html; charset=utf-8" . PHP_EOL;
    $header .= "From: no-reply@example.org" . PHP_EOL;
    

5. 设置服务器反向解析(PTR记录)

联系你的VPS服务商,为服务器公网IP设置反向解析,指向你的域名(如example.org)。Gmail会优先拒绝无PTR记录的服务器发送的邮件。

6. 检查Postfix基础配置

确保/etc/postfix/main.cf中的关键配置正确:

myhostname = example.org
smtp_helo_name = example.org
inet_interfaces = loopback-only
  • myhostname和smtp_helo_name设置为你的域名,避免使用默认localhost
  • inet_interfaces = loopback-only确保Postfix仅处理本地发送的邮件,防止开放中继

内容的提问来源于stack exchange,提问作者TOdiDs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 01:57:39