我在本地用 RAILS_ENV=development rails s 和 RAILS_ENV=production rails s 启动时,邮件都能成功发送,但是部署到服务器后邮件一直发送不了,请问这是为什么呢? 我查看了日志,其中错误显示超时。如下:
Completed 500 Internal Server Error in 30365ms (ActiveRecord: 4.0ms)
Net::OpenTimeout (execution expired):
请问是还要配置什么吗?比如在 app 中?或服务器上?或...?
邮件是需要配置的: https://ruby-china.github.io/rails-guides/action_mailer_basics.html#action-mailer-configuration
默认配置的是 sendmail,如果你的主机上装有 sendmail 程序,那么就可以发送。服务器发不了可能是没装 sendmail。
解决方法之一是在服务器装提供 sendmail 命令的程序,例如 postfix,但是接下来会遇到第二个问题,被收件方判断为垃圾邮件。实际中一般会使用 mailgun 一类的第三方服务来发邮件。
不是太懂,我用的是阿里云万网的邮箱; 关于 config.action_mailer.delivery_method 这个设置有两种参数如下: config.action_mailer.delivery_method = :sendmail config.action_mailer.delivery_method = :smtp 那是用哪个参数呢?一般不都是用:stmp 吗?如果用:stmp 不就可以不用 sendmail 了吗? 还有,我看到有这样一行 location: '/usr/sbin/sendmail', 但我到我本地电脑中查看了这个文件夹,没有这个文件。 但我本地装了 Thunderbird Mail 这个邮件客户端软件,是不是因为服务器上没有发送邮件的软件导致这个结果呢?
这样配置试一下:
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: 'smtp.mxhichina.com',
port: "25",
domain: 'qiye.aliyun.com',
user_name: '[email protected]',
password: 'zenmekenenggaosuni',
authentication: :login
}
config.action_mailer.perform_caching = true
config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true
config.action_mailer.delivery_method = :smtp
host = 'mydomain.com'
config.action_mailer.default_url_options = { host: host }
ActionMailer::Base.smtp_settings = {
:address => 'smtp.mxhichina.com',
:port => '25',
:authentication => :plain,
:user_name => '[email protected]', #ENV['SENDGRID_USERNAME'],
:password => 'mypassword' , #ENV['SENDGRID_PASSWORD'],
:domain => 'mydomain.com',
:enable_starttls_auto => true
}
因为还没配置 ssl,所以在整个生产环境中我都暂时取消了 ssl。
I, [2018-01-20T11:20:03.541107 #20090] INFO -- : [152c4cc9-9457-46f6-8591-2aa9cb2adb5b] Completed 500 Internal Server Error in 30320ms (ActiveRecord: 4.0ms)
F, [2018-01-20T11:20:03.541624 #20090] FATAL -- : [152c4cc9-9457-46f6-8591-2aa9cb2adb5b]
F, [2018-01-20T11:20:03.541659 #20090] FATAL -- : [152c4cc9-9457-46f6-8591-2aa9cb2adb5b] Net::OpenTimeout (execution expired):
这是 log 报告原文,各位帮我看看吧,在开发环境中用 RAILS_ENV=production rails s 启动后能成功发送邮件,部署后怎么都发送不了,不知道怎么了、、、查了很多文章,还是没解决、、、
试了,阿里云默认屏蔽掉 25 端口的,所以我换成了 465 端口,但 465 端口不是需要 ssl 加密吗?我的网站没设置 ssl 能用吗?出现了以下错误:
TypeError (no implicit conversion of Symbol into Integer)
经过各位朋友们的帮助,折腾两天后,终于找到了问题所在并成功解决了!在此,谢过各位了! 在此,把解决方案总结如下: 1.我所用的邮箱是在阿里云注册的企业邮箱,有两个端口 25(非 ssl)和 465(ssl 加密),我用的也是阿里云的服务器,而阿里云服务器上是屏蔽 25 端口的,所以在本地能成功发送邮件而部署后不行;参考
https://help.aliyun.com/knowledge_detail/40572.html?spm=5176.11065259.1996646101.searchclickresult.1abc200RKW2df
在服务器上 ping 后可得出此结论。 2.我第一次部署的时候其实用的是 465 端口的,没成功才换成 25 端口,从而后续问题,而之前用 465 端口之所以不成功是 rails 里的配置不对,摘录正确的配置如下:
config.action_mailer.delivery_method = :smtp
host = 'snugnest.com'
config.action_mailer.default_url_options = { host: host }
config.action_mailer.smtp_settings = {
:address => 'smtp.mxhichina.com',
:port => 465,
:authentication => :plain,
:user_name => '××××@××××.×××', #ENV['SENDGRID_USERNAME'],
:password => '×××××' , #ENV['SENDGRID_PASSWORD'],
:domain => '××××',
:enable_starttls_auto => true,
:ssl => true
}
注意,:ssl 一定要设置!:openssl_verify_mode 一定不能配置!
没这样写过 ,我看到有些直接写 465,有些加引号'465',都试了,这两种写法应该都是对的,我是把
:openssl_verify_mode :peer
这个配置去掉就行了,应该是这个配置不对,我直接删了用默认的就 ok 了。
我昨天也遇到了。。。搜索之后发现 google cloud 屏蔽了邮箱端口。一脸懵逼啊。被迫换成了 mailgun
Google Compute Engine does not allow outbound connections on ports 25, 465, and 587. By default, these outbound SMTP ports are blocked because of the large amount of abuse these ports are susceptible to. In addition, having a trusted third-party provider such as SendGrid, Mailgun, or Mailjet relieves Compute Engine and you from maintaining IP reputation with your receivers.
https://cloud.google.com/compute/docs/tutorials/sending-mail/