解决生产环境不能发送邮件的问题
2018年1月6日 16:39
问题描述
使用 smtp 方式、ActionMailer 发送邮件,开发环境能正常发送,同样的配置移植到生产环境就不能发邮件了。控制台信息显示 sent 已成功发送,且无任何报错信息,但邮箱就是没收到邮件。
解决过程
- 开发环境能正常发送,说明邮件本身应该没有问题,即邮件视图,发件人地址、用户名密码等;
- 换用 QQ 邮箱和 outlook 测试,均不能收到邮件,说明不是接受者邮箱问题;
- 测试 smtp 参数,先后修改了
default_url_options
,domain
,enable_starttls_auto
等参数,都不起作用; - ipV6问题,禁用了ipV6依然不起作用;
- 参考https://stackoverflow.com/questions/16040158/rails-mailer-netopentimeout-execution-expired-exception-on-production-serve,排查端口问题,可能是25端口被屏蔽了,换用465端口,但出现 readtimeout 错误
- 添加参数
ssl: true
问题解决
这其中还有一个很重要的问题,就是用 deliver_later
看不到任何报错,偶然间换成了 deliver_now
发现有 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
}