【问题标题】:Transactional Email not sent from rails server in production on OpenShift but works fine in development事务电子邮件不是从 OpenShift 生产中的 Rails 服务器发送的,但在开发中工作正常
【发布时间】:2016-04-09 03:49:50
【问题描述】:

我有一个在 RedHat 的 OpenShift 上运行的 Ruby on Rails (v4.1.5) 应用程序。 我正在从 Mandrill 切换到 SendGrid。在开发中,我能够将以下内容添加到我的 development.rb 配置文件中:

ActionMailer::Base.smtp_settings = {
  :address   => "smtp.sendgrid.net",
  :port      => 587,
  :authentication => "plain",
  :domain => ENV["DOMAIN_NAME"],
  :enable_starttls_auto => true,
  :user_name => ENV["SENDGRID_USERNAME"],
  :password  => ENV["SENDGRID_PASSWORD"]   
}

而且我可以像以前一样继续使用 ActionMailer。我在本地对其进行了测试并收到了电子邮件,并且标头显示它们来自 sendgrid。

然后我将相同的代码添加到 production.rb 并部署到 OpenShift。我在上面的代码中添加了新的 SENDGRID 用户名和密码环境变量,并验证了它们在 OpenShift 上的设置是否正确。

但是当我测试它时,日志文件显示它已将电子邮件发送到正确的电子邮件地址,但它没有显示在我的 SendGrid 仪表板上,我也没有收到电子邮件。

有谁知道 OpenShift 上可能显示更多信息的任何其他日志文件?我只看了 app-root/runtime/repo/log/production.log。

我尝试删除上面的 enable_starttls_auto 字段,但没有任何改变。

如何调试这个问题?我不知道是在 OpenShift 端还是在 SendGrid 端。

【问题讨论】:

  • 确保在您的生产环境中打开所有必要的端口。
  • SendGrid 和 Mandrill 端口号相同 (587)。它与 Mandrill 一起工作而没有改变任何东西。
  • 我尝试使用 SendInBlue 而不是 SendGrid。它再次在本地开发中工作,但在 OpenShift 上的生产中不起作用。所以我想这就是问题所在。
  • 再次尝试使用 SparkPost 端口 587 和 2525。结果相同。除了 Mandrill 之外,OpenShift 上没有任何功能。现在我真的被困住了。
  • 这是一个长镜头,但请尝试将行 :authentication => "plain" 更改为 :authentication => :plain

标签: ruby-on-rails openshift actionmailer sendgrid sparkpost


【解决方案1】:

这篇文章应该会有所帮助。我不是 Ruby 专家,所以我帮不上什么忙。

https://developers.openshift.com/external-services/sendgrid.html

我知道我们有很多用户在使用 openshift 和 sendgrid。

这是一个 PHP 代码库 - 我知道我知道的语言不正确,但我知道一个很好的例子

https://github.com/sendgrid/openshift-sendgrid-php

【讨论】:

  • 我几乎都在做这一切。但我在 Rails 4 中使用 ActionMailer。ActionMailer 使用他们提到的 Mail gem。我还发现其他 SendGrid 文档显示了使用 ActionMailer 时的配置,这与我所做的相同。我认为 OpenShift 的问题更多,因为我使用几种不同的事务性电子邮件服务得到了相同的结果。
【解决方案2】:

首先,用 Telnet 直接连接:

telnet smtp-relay.sendinblue.com 587
Trying 94.143.17.4...

如果您收到此错误:

telnet: Unable to connect to remote host: Connection timed out

那么,问题不在于 Rails。

就我而言,问题出在端口号。我的服务器在 DigitalOcean 上运行,它阻止与 587 端口的连接,除非您要求他们解除阻止,并且他们也会根据主机名解除阻止,这意味着它可以与 mandrill 一起使用,但不能与其他端口一起使用。

记住“2525”是新的“587”,即使对于 SendinBlue 也是如此。


其他检查您是否在 telnet 上超时的事项:

  1. 主机名:人们通常使用“smtp.sendinblue.com”而不是“stmp-relay.sendinblue.com”。
  2. 端口:试试 2525。
  3. ipv6 vs ipv4:检查主机名是否被转换为 IPv4。如果没有,请尝试通过编辑“/etc/sysctl.conf”来禁用 IPv6。
  4. firewall / AppArmor:检查它们是否不是这里的罪魁祸首。
  5. 主机名解析:在您知道电子邮件发送正常的机器上运行相同的 telnet 命令。检查翻译后的 ip(“正在尝试 xxx...”的 xxx 部分)是否相同。如果没有,请返回您的服务器并将主机名替换为此 ip。如果可行,请更改您的 /etc/hosts 并强制主机名使用此 ip。

禁用 IPv6:

将以下行添加到您的/etc/sysctl.conf

#disable ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

更改需要重新启动。

您可以测试 IPv6 是否被禁用

cat /proc/sys/net/ipv6/conf/all/disable_ipv6

【讨论】:

  • 感谢您的详细回答。但是 telnet 在我运行 rails 的 OpenShift 服务器上工作: > telnet smtp-relay.sendinblue.com 587 Trying 94.143.17.4... 连接到 smtp-relay.sendinblue.com。转义字符是 '^]'。 220 smtp-relay.sendinblue.com ESMTP Sendinblue SMTP 2.0
  • 我的 rails 配置中确实有正确的主机名。
  • 你能在这台服务器上打开一个 Rails 控制台吗? RAILS_ENV=production rails c。然后,尝试从那里发送电子邮件。 MyMailer.new(param_1, param_2).deliver。它返回什么?
  • 在 OpenShift 上运行 rails 控制台时遇到其他问题。努力解决这个问题,但也许不值得。我可能不得不寻找另一个主机。
猜你喜欢
  • 1970-01-01
  • 2014-09-13
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多