Mailer 部署后邮件发送不成功

maxchen · 2018年01月18日 · 最后由 hging 回复于 2018年01月25日 · 10514 次阅读

我在本地用 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 一类的第三方服务来发邮件。

Rei 回复

不是太懂,我用的是阿里云万网的邮箱; 关于 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 这个邮件客户端软件,是不是因为服务器上没有发送邮件的软件导致这个结果呢?

maxchen 回复

用 smtp 就不用 sendmail。

现在服务器生产环境的邮件配置是怎样?(隐去账号密码)

这样配置试一下:

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
  }
Rei 回复
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。

maxchen 回复

还是不行、、、

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 启动后能成功发送邮件,部署后怎么都发送不了,不知道怎么了、、、查了很多文章,还是没解决、、、

Rei 回复

您好,能帮忙看下我该怎么解决我的问题吗?

Net::OpenTimeout 无法连接 smtp 服务器,检查配置和网络

Rei 回复

是我的服务器的配置和网络吗?网站能正常访问,怎么检查配置和网络呢?新手不太懂、、、麻烦您了

maxchen 回复

服务器到邮件服务器的配置和网络。

maxchen 回复

大哥,你试下我的配置呗

railsboy 回复

试了,不行😀 按照 log 的反馈,应该是服务器的配置问题,不是 app 的问题

Rei 回复

我也觉得是服务器配置的问题,不服务器问题没有头绪,有帖子参考吗?

maxchen 回复

看你的日志,应该不是服务器配置的问题,你看下是否是网络问题。

railsboy 回复

我本地网络应该是没问题的,有可能是服务器的网络配置问题,但我一点头绪都没有、、、😄

maxchen 回复

把你服务器配置的 domain 贴出真实的地址,因为你现在是错的,不知道你实际配的对不对。

railsboy 回复

哪个?你是指:domain => 'mydomain.com',还是?

maxchen 回复

domain => 'mydomain.com' 。另外,你看下你本地环境能发吗?自己排除下是否是网络问题。

railsboy 回复

本地环境可以发的。

maxchen 回复

在服务器上 ping 下你的邮件配置中的 address

railsboy 回复

试了,阿里云默认屏蔽掉 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 一定不能配置!

railsboy 回复

搞定了,谢谢😊

Rei 回复

我搞定了,谢谢😊

maxchen 关闭了讨论。 01月20日 15:28
maxchen 重新开启了讨论。 01月20日 15:28
maxchen 回复

那就好。你前面报 TypeError, 是不是你邮件配置中的 port => :465 了?

railsboy 回复

没这样写过😄 ,我看到有些直接写 465,有些加引号'465',都试了,这两种写法应该都是对的,我是把

:openssl_verify_mode :peer

这个配置去掉就行了,应该是这个配置不对,我直接删了用默认的就 ok 了。

maxchen 回复

噢噢 ~

和我几天前遇到的问题十分相似,解决过程在此贴出来以供后续参考

我昨天也遇到了。。。搜索之后发现 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/

maxchen 关闭了讨论。 02月03日 22:32
需要 登录 后方可回复, 如果你还没有账号请 注册新账号