
表单页面提示「发送成功」,邮箱却什么都没收到——这类问题会让询盘悄无声息地流失,而且往往很久之后才被发现。WordPress 发信默认依赖 PHP 的 mail 功能,一封通知邮件要经过表单插件、主机、发信服务器、DNS 认证记录和收件方过滤多个环节,任何一环出问题,都会表现为「收不到」。按下面的顺序从易到难排查,可以逐步缩小范围。
第 1 步:确认表单本身的设置
- 检查表单插件的通知设置:收件人地址是否正确、通知是否启用。Contact Form 7 在表单的「邮件」选项卡中配置,WPForms、Fluent Forms 等在「通知」设置中配置;
- 「发件人」应使用本站域名的邮箱(例如
noreply@你的域名),不要直接填访客提交的邮箱,否则会因为发件域不匹配被拒收或进入垃圾箱。访客邮箱可以放在 Reply-To 中,回复时直接回给访客; - Contact Form 7 保存表单时会检查配置,例如发件人地址不属于站点域名时会给出提示,留意表单编辑页顶部的警告;
- 如果插件支持保存提交记录,先确认后台有这条记录。有记录说明表单提交本身成功,问题出在发信环节。
第 2 步:测试 WordPress 能否发信
绕开表单插件,直接测试 wp_mail():
wp eval 'var_dump( wp_mail( "[email protected]", "wp_mail 测试", "这是一封测试邮件" ) );'
- 返回
bool(false):WordPress 发信直接失败,多半是主机禁用了 mail 函数,或服务器上没有可用的发信程序; - 返回
bool(true)但收不到:邮件已交给发信程序,问题在后面的投递环节——被拦截、进入垃圾箱或被收件方拒收。
想看到具体的失败原因,可以临时加一段代码记录 wp_mail_failed 钩子返回的错误,测试结束后删除:
add_action( 'wp_mail_failed', function ( $error ) {
error_log( 'wp_mail_failed: ' . $error->get_error_message() );
} );
配合 wp-config.php 中的 WP_DEBUG_LOG,错误信息会写入 wp-content/debug.log。
第 3 步:改用 SMTP 发信
PHP mail 在很多主机上并不可靠,推荐改用 SMTP:使用企业邮箱、域名邮箱或专门的事务邮件服务,通过 WP Mail SMTP、FluentSMTP 等插件填写 SMTP 服务器、端口、加密方式和账号。配置时注意:
- 端口一般使用 465(SSL)或 587(STARTTLS),以邮件服务商的文档为准;
- 很多邮箱服务需要使用「授权码」或应用专用密码,而不是邮箱登录密码;
- SMTP 账号的邮箱应与表单「发件人」保持一致,否则部分服务商会拒绝发送或改写发件人;
- 只保留一个 SMTP 插件,多个插件同时接管
wp_mail会互相覆盖。
配置完成后,用插件自带的测试邮件功能发送一封,并查看插件的发送日志或调试输出。
第 4 步:排除主机与网络限制
不少云服务器默认封禁出站 25 端口,部分虚拟主机还会禁用 mail 函数或限制每小时的发信数量。在服务器上测试能否连通 SMTP 服务器:
nc -vz smtp.example.com 465
openssl s_client -connect smtp.example.com:465 -quiet
连接超时说明出站端口被拦截,需要改用 465 或 587 端口,或向服务商申请解封。同时检查服务器防火墙、云安全组和面板安全插件是否拦截了出站连接。
第 5 步:检查发件域的 SPF、DKIM 与 DMARC
邮件能发出去,却进了垃圾箱或被退回,多半与发件域的认证记录有关。先查看现有记录:
dig +short TXT example.com
dig +short TXT _dmarc.example.com
dig +short TXT 选择器._domainkey.example.com
- SPF:在域名的 TXT 记录中声明哪些服务器可以代表该域名发信,应包含你实际使用的邮件服务商。一个域名只能有一条 SPF 记录,存在多条会导致校验失败;
- DKIM:在邮件服务商后台获取 DKIM 公钥并添加到 DNS,选择器名称以服务商提供的为准;
- DMARC:告诉收件方 SPF、DKIM 校验失败时如何处理。可以先设置
p=none观察报告,确认无误后再逐步收紧。
收到测试邮件后,在邮箱中打开「查看原文」或「显示邮件原始内容」,检查 spf=pass、dkim=pass、dmarc=pass 等认证结果。
第 6 步:收件方过滤与插件冲突
- 检查收件邮箱的垃圾箱、广告邮件分类和拦截记录;企业邮箱还需要请管理员确认邮件网关有没有拦截;
- 把发件地址加入白名单或通讯录;
- 更新插件后突然收不到邮件,用排障模式停用其他插件后重新测试,确认是否有插件改写了
wp_mail或 PHPMailer 设置; - 启用了页面缓存的站点,确认表单页没有因为整页缓存导致表单的验证信息过期,表现为提交失败或提交成功但后台没有记录。
第 7 步:建立备用通知与定期检查
- 开启表单插件的提交记录存储,邮件失败时数据也不会丢;
- 重要询盘可以同时推送到企业微信、钉钉或 CRM;
- 每次换主机、改 DNS、更新邮件或表单插件后,都实际提交一次测试表单;
- 定期用测试邮箱检查投递结果和认证状态。
延伸阅读:上线检查清单中的「表单与统计」一节、插件冲突排查流程;换主机后的注意事项见 WordPress 迁移与托管专题。wp_mail() 的参数与相关钩子说明见 WordPress 开发者文档。
常见问题
为什么测试邮件能收到,访客提交的表单却收不到?
常见原因是表单「发件人」填写了访客邮箱,导致发件域与认证记录不匹配而被拒收。改为使用本站域名发件,把访客邮箱放到 Reply-To。
可以用个人邮箱的 SMTP 发信吗?
流量很小的站点可以使用,但需要在邮箱设置中开启 SMTP 服务并使用授权码,且发件人必须是该邮箱本身。业务量较大时,建议使用企业邮箱或事务邮件服务。
邮件总是进垃圾箱怎么办?
先确认 SPF、DKIM、DMARC 都已通过,再检查邮件内容:只有链接没有正文、标题过于营销化,也会提高被过滤的概率。
表单与询盘链路直接关系到线索是否流失,如果排查后仍然不稳定,可以 申请免费诊断。
