Contact Form 7 邮件问题排查指南

如果你在使用普通的 Bluehost 和 Godaddy 虚拟主机,请先考虑更换主机,它们不值得耗费精力。

1,检查 Contact Form 7 设置

如果没有改动过 Mail 部分的设置,可以跳过这部分。

contact-form-7-mail-configuration插件作者可谓用心良苦,在某次更新后预先设置了发信部分,解释如下:

  • To——提醒邮件发送到哪个邮箱
  • From——提醒邮件是谁发出的,按照平常的收发信习惯,这里应该填写留言者的邮箱即 [your-email],可是有些主机会验证发信人,就换成了 @站点域名 形式,至于为什么使用 wordpress 开头,可能是方便主机商做白名单吧。
  • Subject——邮件标题
  • Additional Headers——如果 From 没有填写留言者的邮箱,那邮箱中收到提醒后想直接回复给留言者怎么办呢,Reply-To 就是解决这个问题的。它标明虽然这封邮件是从主机上发送过来的,但是要回复到留言者邮箱 [your-email]
  • Message Body——邮件内容

已经设定的这么好,插件作者还是不放心,新版中又加了个功能——验证

validate-contact-form-7啧啧,业界良心!

检查 Mail 设置,包括空格,已经改动过怎么办呢?新建一个表单做对比就行了。

2,检查 From 邮箱

如上一步中所说,有些主机会验证发信人,比如 Bluehost,用主机商的口吻说是这样的:

To 和  From 这两项是可以修改的,也就是说,用户可以用我们的主机,以任意邮箱地址发给任何人,假如发垃圾钓鱼诈骗邮件,岂不是要怪我咯,不行要验证下,To 管不了,From要管管

怎么管呢?Bluehost 是这么做的,From 邮箱要求是 cPanel 中已添加的邮箱账户,在这儿添加:

bluehost-email-managerbluehost-create-email-account这儿只能添加以 assign 过的域名结尾的邮箱账户,而 assign 域名时是验证过 EPP 的,这样就能保证发信人是真正的域名所有者了,完美~

如果表单直接提示发送失败,那么试试添加一个和 From 一致的邮箱账户到 cPanel 中。

3,检查 Email Routing

能否收到提醒不仅和发有关,还和收有关

假如同一个域名既绑定了 Bluehost 主机,又使用了其它的企业邮箱,比如 QQ 企业邮箱,那邮件投递就可能出问题,Bluehost 默认以为用户在使用它的邮箱,发送邮件时它就直接往本地发了,而不往外部的邮件服务器投递,这样就会导致收不到邮件。

如果你也在使用 Bluehost 主机,但同域名没有使用 Bluehost 的邮箱,修改 Email Routing 为 Remote,方法如下:

bluehost-zone-editorbluehost-zone-editor-select-domain

选择域名后,往下拉,找到 MX (Mail Exchanger)

bluehost-mail-exchanger点击 more,勾选 Remote Mail Exchanger

bluehost-mail-exchanger-remote

4,检查 NS

如果按照上述方法排查后问题仍然得不到解决,向主机商询问为什么时,他们可能会这么回复:

收不到邮件,有可能是用户邮箱问题,比如 mx 记录设置出错,而不是我们没发

为了避免主机商推脱,联系客服前修改 NS 为主机商的 NS 服务器,即将记录设置部分交给主机商。

做这步前请先了解以下几点:

  • NS 的修改是在域名注册商处进行的,Godaddy 注册的就去 Godaddy 改,Namesilo 注册的就去 Namesilo 改,万网注册的就去万网改。
  • Bluehost 的 NS 服务器是 ns1.bluehost.com 和 ns2.bluehost.com,如果不知道域名当前的 NS 服务器是什么,可以到这里查询:dns.google.comgoogle-dns-resolvewp300.com 换成你的域名即可
  • NS 相当于一个挂了路牌的底座,修改它的值就像告诉行人去哪找这个底座;改为 Bluehost 的 NS,行人问路时就会去 Bluehost 问。
  • 设置底座前不要忘记向底座加上 A 记录,C 记录,MX 记录,TXT 记录等这些路牌;比如域名 NS 之前在万网,做了 MX 记录指向 QQ 企业邮箱,那么 NS 改到 Bluehost 后,需要到 Bluehost 再设置次 MX 记录。

5,换种方式发信——SMTP

如果主机商客服也不给力,那么可以采用 SMTP 发信。

实际上很多好的主机商就是这么做的,发信是件很麻烦的事,专业的事还是交给专业的服务。

采用 SMTP 发信,发信部分就由 SMTP 服务方接管了,能否正常发信和以下因素有关:

  • SMTP 设置是否正确。包括账号,密码,端口,服务器地址,加密方式等(未来我可能视需求开售些专用于邮件提醒的 SMTP 账号)
  • 主机能否正常访问 SMTP 服务器。有的主机商刚好屏蔽了 SMTP 发信使用的端口
  • SMTP 服务器是否限制了发信。比如当天发信达到数量限制,或者 SMTP 账户出现异常,需要登录网页端重新验证等

建议使用 Postman SMTP Mailer/Email Log

因为它有个很棒的调试功能,而使用 Contact From 7 最愁的就是——没有 Log, 无法调试。

使用 Bluehost 郁闷的一点也是发信过程就像一个黑箱,发出信,无反馈,不知道信到底发没发出去,也不知道如果没发出去为什么。

postman-smtp-troubleshooting

 2016年4月10日19:50:01 更新:

正常的主机商在自己的 mail() 不能发信时会让客户使用 SMTP 发信

逗比的主机商——Bluehost 和 Godaddy 之流居然把外部 SMTP 给封了,真不知道怎么想的,竭尽全力给客户找不自在么?

如果 外部 SMTP 被封,Bluehost 可以使用 cPanel 自带邮局发信,这个没被封。

或者使用 API 发信,Postman SMTP Mailer/Email Log 插件目前支持三种 API 发信:

  • Gmail
  • Sendgrid
  • Mandrill

其中 Mandtrill 被 MailChimp 收购,SendGrid 有账户审查,硕果仅存的 Gmail 亲测可用但视频教程中的界面和现在的界面有些不同。

2017年10月12日19:15:59 更新:

Gmail 现在需要申请 API 才可以发信,不再推荐使用,另外 Postman SMTP 已被从 WordPress plugins directory 移除,待归

2018年7月25日 12点27分 更新:

Gmail 的 mail API 验证 Google search console 后,在提示不能使用的页面点高级,继续使用就行了。

建议使用 WP Mail SMTP by WPForms 插件

参考这篇文章: https://wpforms.com/how-to-securely-send-wordpress-emails-using-gmail-smtp/

再次,逗比的主机商——Bluehost 美国把 mod_security 开了,所以不能用 Gmail mail API 发信,联系客服打开,good luck

 

 

6,一些小贴士

  • 排查之前,弄清楚是谁在收信,上文中查询 NS 记录的地方同样可以查询 MX 记录。企业邮箱在没有使用 SMTP 时只负责了邮件提醒的收件部分,发件是经主机发出的,和企业邮箱无关。
  • 发信到收信可能会有延迟,测试时加上时间戳,比如我写这段话的时间是 2016年3月29日00:04:27,避免混乱。
  • QQ 邮箱做为收件人测试时可以通过【邮箱首页】-【我的信息】-【自助查询】获取更多收件信息。
  • 不管能否收到信,安装一个记录提交信息的插件,如 Contact Form DB 总是好的,不易漏掉,方便导出,有备无患。

最后,邮件排查是件体力活,每个步骤排查后都发信测试可能耗费数小时,所以我也不情愿收费调试。

我的排查经历中遇到过两次所有设置都对表单就是不能发的情形,如果你也遇到的话考虑换主机吧,毕竟及时收到邮件提醒并在5分钟内回复,留住客户概率会大增呢。

3 thoughts on “Contact Form 7 邮件问题排查指南”

  1. 土豆,您好请教个问题:
    Namesilo买的域名,开始解析到bluehost,后面解析到cloudflare, 解析后要不要把bluehost上面的A 记录,C 记录,MX 记录,TXT 记录全部删除掉?

    1. 不需要,只要把 Bluehost 上的记录复制到 Cloudflare,一般从 Bluehost 到 Cloudflare 它自动复制的挺全的。

Leave a Reply to homu Cancel reply

Your email address will not be published.