本文约 4,154 字,预计阅读 11 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:九成的「收不到信」,问题不在插件而在发信通道
WordPress 默认用 wp_mail() 发信,底层是 PHP 的 mail() 函数。它不发任何认证,直接把邮件丢给服务器本地的邮件服务。在虚拟主机或国内云服务器上,这个本地服务往往要么没装、要么发出的邮件被各大邮箱直接判为垃圾邮件。于是就出现了经典的症状:后台提示密码重置邮件已发送,用户却始终收不到;联系表单天天有人填,销售一封没收到。
解决思路只有一个:改用经过认证的外部 SMTP 服务,让插件接管 wp_mail()。WP Mail SMTP 和 FluentSMTP 是目前最主流的两款插件,前者配置向导完整、支持的服务商最多,后者免费版自带邮件日志和备用连接(fallback),排错更方便。无论选哪款,接入参数都绕不开那几项:服务器地址、端口、加密方式、用户名、密码。
原理分析:端口、加密与认证的三对应关系
SMTP 的常见组合只有三种,混淆它们是配置失败的首要原因:
| 端口 | 加密方式 | 说明 |
|---|---|---|
| 25 | 无 / STARTTLS | 多数云厂商默认封禁,防止垃圾邮件 |
| 465 | SSL / TLS(隐式) | 连接建立即加密,国内服务商常用 |
| 587 | STARTTLS(显式) | 先明文握手再升级,Gmail、SendGrid 等推荐 |
第二个要点是发件人与域名的一致性。即便 SMTP 认证通过,如果「From」地址是 noreply@gmail.com 而站点域名是 example.com,SPF 与 DKIM 校验不通过,邮件仍会进垃圾箱。正确做法是:发件人使用站点自有域名下的邮箱(如 noreply@example.com),并在 DNS 里为该域名的发信服务配置 SPF、DKIM、DMARC 记录。
第三个要点是插件如何接管发信。两款插件都是在 phpmailer_init 阶段(WordPress 的 PHPMailer 初始化钩子)注入配置,把发信方式从 mail 改为 smtp。因此任何其他调用 wp_mail() 的插件(表单、WooCommerce、密码找回)都会自动受益——这也是为什么不需要为每个插件单独配 SMTP。
保姆级实操:配置 → 常量 → 验证
步骤1:准备发信账号。 二选一:使用专业邮件服务(SendGrid、Mailgun、Brevo、Postmark、Amazon SES 等),或使用企业邮箱的 SMTP(腾讯企业邮、阿里云邮件推送等)。面向海外用户优先选专业服务,送达率与统计更可靠。
步骤2:填写 SMTP 参数。 常见服务商的参数如下(以服务商当前文档为准):
腾讯企业邮 / QQ 企业邮箱
SMTP 服务器:smtp.exmail.qq.com
端口:465(SSL) 或 587(STARTTLS)
用户名:完整邮箱地址
密码:邮箱密码或客户端专用密码
阿里云邮件推送
SMTP 服务器:smtpdm.aliyun.com
端口:465(SSL) 或 80
用户名:发信地址
密码:SMTP 服务密码(控制台单独设置)
Gmail / Google Workspace
SMTP 服务器:smtp.gmail.com
端口:587(STARTTLS) 或 465(SSL)
用户名:完整 Gmail 地址
密码:应用专用密码(开启两步验证后生成)
SendGrid / Mailgun / Brevo
通常使用 API 密钥作为密码,主机与端口见服务商文档
步骤3:用插件向导完成配置。 WP Mail SMTP 走「Settings → General」,填发件人邮箱与名称,勾选「Force From Email / Force From Name」(强制发件人,避免其他插件覆盖),选择 Mailer 并填参数。FluentSMTP 走「FluentSMTP → Settings」,同样填发件人与连接信息,它的免费版支持配置「备用连接」,主连接失败时自动切换,适合对送达要求高的站点。
步骤4:把敏感凭据移出数据库。 插件默认把 SMTP 密码存在数据库里,能接触后台的人都能看到。WP Mail SMTP 支持用 wp-config.php 常量覆盖,把凭据放在配置文件里更安全(配置文件不进版本库、权限收紧)。
<?php
// wp-config.php:用常量定义 SMTP 连接(具体常量名以插件文档为准)
define( 'WPMS_MAILER', 'smtp' );
define( 'WPMS_SMTP_HOST', 'smtp.exmail.qq.com' );
define( 'WPMS_SMTP_PORT', 465 );
define( 'WPMS_SSL', 'ssl' );
define( 'WPMS_SMTP_AUTH', true );
define( 'WPMS_SMTP_USER', 'noreply@example.com' );
define( 'WPMS_SMTP_PASS', '从环境变量或配置文件读取,不要写进仓库' );
define( 'WPMS_MAIL_FROM', 'noreply@example.com' );
define( 'WPMS_MAIL_FROM_NAME','站点名称' );
define( 'WPMS_SET_RETURN_PATH', true );
步骤5:用测试邮件验证。 两款插件都提供发送测试邮件的功能(WP Mail SMTP 在「Email Test」,FluentSMTP 在设置页)。测试通过后,再去检查收件箱与垃圾箱。
步骤6:配置 DNS 记录。 为发信域名添加 SPF、DKIM 与 DMARC,这是送达率的决定性因素。
SPF(TXT 记录,主机记录 @)
v=spf1 include:服务商的 SPF 记录 ~all
DKIM(TXT 记录,主机记录由服务商给出,形如 s1._domainkey)
v=DKIM1; k=rsa; p=服务商提供的公钥
DMARC(TXT 记录,主机记录 _dmarc)
v=DMARC1; p=none; rua=mailto:dmarc@example.com
步骤7:挂上失败日志。 一旦发信失败,wp_mail_failed 会带上 WP_Error,记下来比反复重试有用。
<?php
add_action( 'wp_mail_failed', function ( $wp_error ) {
error_log( sprintf(
'[mail-failed] %s | %s',
$wp_error->get_error_code(),
$wp_error->get_error_message()
) );
} );
步骤8:用命令行先排除网络问题。 插件报「无法连接」时,先在服务器上确认端口是否可达,再回头查配置。
# 测试 465 端口(隐式 SSL)
timeout 5 openssl s_client -connect smtp.exmail.qq.com:465 -quiet < /dev/null
# 测试 587 端口(STARTTLS)
timeout 5 openssl s_client -starttls smtp -connect smtp.gmail.com:587 -quiet < /dev/null
# 检查 DNS 记录是否生效
nslookup -type=TXT example.com
常见踩坑
- 25 端口被云厂商封禁。阿里云、腾讯云等默认封禁 25 端口出方向,改用 465 或 587。
- 用户名与发件人不一致。企业邮箱要求用户名是完整邮箱地址,写成前缀会报认证失败(常见报错:
535 Authentication failed或Invalid login)。 - 未开启客户端 SMTP 服务。QQ 邮箱、阿里云邮件推送等需要在后台单独开启 SMTP 并生成专用密码,直接用登录密码会失败。
- 强制发件人未勾选。其他插件(如表单插件)用自己的发件人,导致 SPF 校验失败进垃圾箱。
- 超时类报错。表现为
SMTP Error: Could not connect to SMTP host或Connection timed out,多半是端口不通或服务器防火墙限制,而不是密码错误。 - 案例:某站点换了服务器后所有邮件停发,插件提示
Connection timed out (110)。排查发现新服务器做了出网限制,只放行了 80/443。最终改用支持 443 端口的 API 型邮件服务(通过 HTTPS 调用),问题彻底解决。这个案例说明:排查顺序应该是网路 → 认证 → 内容,而不是一上来就换插件。 - DKIM 密钥未按服务商要求换行。DNS 记录里的公钥过长需要拆分,直接粘贴会导致记录无效。
- 日志泄露收件人信息。邮件日志插件会把收件地址、标题存进数据库,属于个人信息,需按表单数据存储与导出(GDPR 考量)的思路定期清理。
总结
配置 SMTP 的顺序建议是:先在命令行确认端口可达 → 在插件里填参数并勾选强制发件人 → 把凭据移到 wp-config 常量 → 发送测试邮件 → 配置 SPF/DKIM/DMARC → 挂上 wp_mail_failed 日志。插件选择上,需要最多服务商支持和完善向导选 WP Mail SMTP,需要免费邮件日志与备用连接选 FluentSMTP。记住一个判断标准:认证失败看凭据与用户名格式,连接失败看端口与出网策略,能发但进垃圾箱看 DNS 与发件人一致性。日志与退信分析,见用插件记录邮件发送日志排查收不到信。
