解决生产环境不能发送邮件的问题
创建于: 2018-01-06  
记录 Rails

问题描述

使用 smtp 方式、ActionMailer 发送邮件,开发环境能正常发送,同样的配置移植到生产环境就不能发邮件了。控制台信息显示 sent 已成功发送,且无任何报错信息,但邮箱就是没收到邮件。

解决过程

  1. 开发环境能正常发送,说明邮件本身应该没有问题,即邮件视图,发件人地址、用户名密码等;
  2. 换用 QQ 邮箱和 outlook 测试,均不能收到邮件,说明不是接受者邮箱问题;
  3. 测试 smtp 参数,先后修改了 default_url_options, domain, enable_starttls_auto 等参数,都不起作用;
  4. ipV6问题,禁用了ipV6依然不起作用;
  5. 参考https://stackoverflow.com/questions/16040158/rails-mailer-netopentimeout-execution-expired-exception-on-production-serve,排查端口问题,可能是25端口被屏蔽了,换用465端口,但出现 readtimeout 错误
  6. 添加参数 ssl: true 问题解决

这其中还有一个很重要的问题,就是用 deliverlater 看不到任何报错,偶然间换成了 delivernow 发现有 Net::OpenTimeout 错误才顺藤摸瓜解决了问题。telnet smtp.ym.163.com 25 是不通的,telnet smtp.ym.163.com 465 可以连接。所以很有可能就是服务商屏蔽了25端口导致的这个问题。

部分相关代码

production.rb

config.action_mailer.perform_caching = false
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  address:              'smtp.ym.163.com',
  port:                  465,
  ssl:                   true,
  user_name:             your_username,
  password:              your_password,
  authentication:       'plain',
  enable_starttls_auto:  true
}