Ruby on rails 事务性电子邮件在OpenShift的生产环境中未从rails服务器发送,但在开发环境中运行良好

Ruby on rails 事务性电子邮件在OpenShift的生产环境中未从rails服务器发送,但在开发环境中运行良好,ruby-on-rails,openshift,actionmailer,sendgrid,sparkpost,Ruby On Rails,Openshift,Actionmailer,Sendgrid,Sparkpost,我有一个RubyonRails(v4.1.5)应用程序运行在RedHat的OpenShift上。 我正在从Mandrill切换到SendGrid。在开发中,我能够将以下内容添加到development.rb配置文件中: ActionMailer::Base.smtp_settings = { :address => "smtp.sendgrid.net", :port => 587, :authentication => "plain", :dom

我有一个RubyonRails(v4.1.5)应用程序运行在RedHat的OpenShift上。 我正在从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上的其他日志文件可能会显示更多信息?我只查看了approot/runtime/repo/log/production.log

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


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

本文应该会有所帮助。我不是红宝石专家,所以我真的帮不了你

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

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


首先,与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是否超时的其他事项:

  • 主机名:人们通常使用“smtp.sendinblue.com”而不是“stmp relay.sendinblue.com”
  • 端口:试试2525
  • ipv6 vs ipv4:检查主机名是否转换为ipv4。如果没有,请尝试通过编辑“/etc/sysctl.conf”来禁用IPv6
  • 防火墙/AppArmor:检查他们是否是这里的罪魁祸首
  • 主机名解析:在您知道电子邮件正在发送的机器上运行相同的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
    

    确保生产环境中所有必要的端口都已打开。SendGrid和Mandrill端口号都相同(587)。它与Mandrill一起工作,没有任何改变。我尝试使用SendInBlue而不是SendGrid。同样,它在本地开发中起作用,但在OpenShift的生产中不起作用。我想这就是问题所在。请使用SparkPost端口587和2525重试。同样的结果。除了Mandrill之外,OpenShift上没有其他功能。现在我真的被卡住了。这是一个很长的问题,但是试着把行
    :authentication=>“plain”
    改为
    :authentication=>:plain
    ,我差不多都在做这些了。但我在Rails 4中使用ActionMailer。ActionMailer使用他们提到的邮件宝石。我还发现其他SendGrid文档显示了使用ActionMailer时的配置,这与我所做的相同。我认为OpenShift的问题更多,因为我在几种不同的事务性电子邮件服务中得到了相同的结果。感谢您提供的详细答案。但是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\u ENV=生产RAILS c。然后,尝试从那里发送电子邮件<代码>MyMailer.new(参数1,参数2)。传递。它返回什么?在OpenShift上运行rails控制台时遇到其他问题。正在努力解决这个问题,但可能不值得。我可能得另找一个主人。