在 Heroku 中尝试使用 Mailgun 发送电子邮件时出现 500 内部服务器错误,使用 Rails 7 和 mail_form

Getting 500 Internal Server Error while trying to send an email using Mailgun in Heroku , using Rails 7 and mail_form

我正在这里学习本教程 https://gist.github.com/stevecondylios/16a53b73f22621e3cde2e17096dbf5ca

它教你如何在 Rails 6 上使用 mail_form 制作一个简单的联系表,我使用的是 Rails 7,大部分过程是相同的, 它在开发中运行良好,因为我已经用 MailCatcher 测试了几次并且邮件发送正确,我遇到的唯一问题是当我尝试在生产环境中测试表单时。

问题来自 Mailgun 500 Internal Server Error,当我提交表单时,这让我感到困惑,因为我还没有在互联网上找到类似的问题,我已经交叉引用了几个教程和问题,我发现了其他几条错误消息,还有一些 500 Internal Server Error 但 none 的答案对他们有帮助。

我的配置几乎与教程中的完全相同,但这是我的配置,也许我遗漏了什么,请注意我已经添加了真正的“example@mail.com”到“ Mailgun 中的“授权收件人”部分,并且我有一个自定义域并且可以与 Heroku 的其余部分正常工作,我还在 Heroku 上设置了正确的 ENV 变量:

联系方式:

class Contact < MailForm::Base
  attribute :name,      validate: true
  attribute :email,     validate: /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i
  attribute :message
  attribute :nickname,  captcha: true

  # Declare the e-mail headers. It accepts anything the mail method
  # in ActionMailer accepts.
  def headers
    {
      :subject => "Contact Form Inquiry",
      :to => "example@mail.com",
      :from => %("#{name}" <#{email}>)
    }
  end
end

在production.rb

ActionMailer::Base.smtp_settings = {
  :port           => ENV['MAILGUN_SMTP_PORT'],
  :address        => ENV['MAILGUN_SMTP_SERVER'],
  :user_name      => ENV['MAILGUN_SMTP_LOGIN'],
  :password       => ENV['MAILGUN_SMTP_PASSWORD'],
  :domain         => 'https://www.example.com/',
  :authentication => :plain,
}
ActionMailer::Base.delivery_method = :smtp

Heroku 日志:

2022-04-28T20:35:32.118071+00:00 heroku[router]: at=info method=POST path="/contacts" host=www.pocket-witch.games request_id=b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b fwd="177.249.170.124" dyno=web.1 connect=0ms service=13ms status=500 bytes=1827 protocol=https
2022-04-28T20:35:32.106145+00:00 app[web.1]: I, [2022-04-28T20:35:32.106072 #4]  INFO -- : [b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b] Started POST "/contacts" for 177.249.170.124 at 2022-04-28 20:35:32 +0000
2022-04-28T20:35:32.106961+00:00 app[web.1]: I, [2022-04-28T20:35:32.106912 #4]  INFO -- : [b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b] Processing by ContactsController#create as TURBO_STREAM
2022-04-28T20:35:32.107080+00:00 app[web.1]: I, [2022-04-28T20:35:32.107015 #4]  INFO -- : [b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b]   Parameters: {"authenticity_token"=>"[FILTERED]", "contact"=>{"name"=>"John", "email"=>"example@mail.com", "message"=>"Example message", "nickname"=>""}, "commit"=>"Send Message"}
2022-04-28T20:35:32.109199+00:00 app[web.1]: I, [2022-04-28T20:35:32.109137 #4]  INFO -- : [b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b]   Rendered contact_mailer/contact_mail.html.erb within layouts/mailer (Duration: 0.1ms | Allocations: 8)
2022-04-28T20:35:32.109367+00:00 app[web.1]: I, [2022-04-28T20:35:32.109331 #4]  INFO -- : [b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b]   Rendered layout layouts/mailer.html.erb (Duration: 0.3ms | Allocations: 46)
2022-04-28T20:35:32.109834+00:00 app[web.1]: I, [2022-04-28T20:35:32.109777 #4]  INFO -- : [b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b]   Rendered contact_mailer/contact_mail.text.erb within layouts/mailer (Duration: 0.1ms | Allocations: 4)
2022-04-28T20:35:32.109975+00:00 app[web.1]: I, [2022-04-28T20:35:32.109923 #4]  INFO -- : [b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b]   Rendered layout layouts/mailer.text.erb (Duration: 0.2ms | Allocations: 41)
2022-04-28T20:35:32.115988+00:00 app[web.1]: I, [2022-04-28T20:35:32.115921 #4]  INFO -- : [b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b] Delivered mail 626afa941bd21_45348778b1@b96704a7-29a2-4902-83e1-099673240203.mail (2.8ms)
2022-04-28T20:35:32.116193+00:00 app[web.1]: I, [2022-04-28T20:35:32.116158 #4]  INFO -- : [b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b] Completed 500 Internal Server Error in 9ms (Allocations: 3976)
2022-04-28T20:35:32.116915+00:00 app[web.1]: F, [2022-04-28T20:35:32.116874 #4] FATAL -- : [b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b]   
2022-04-28T20:35:32.116916+00:00 app[web.1]: [b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b] Errno::ECONNREFUSED (Connection refused - connect(2) for 127.0.0.1:25):
2022-04-28T20:35:32.116917+00:00 app[web.1]: [b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b]   
2022-04-28T20:35:32.116917+00:00 app[web.1]: [b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b] app/controllers/contacts_controller.rb:11:in `block in create'
2022-04-28T20:35:32.116917+00:00 app[web.1]: [b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b] app/controllers/contacts_controller.rb:10:in `create'

编辑:我在下面添加了一些 Heroku ENV 变量,我已经双重确定 ENV 变量,例如 MAILGUN_DOMAIN 并且与我的 mailgun 帐户中的匹配。

我注意到的一些其他事情是错误似乎源于 @contact.deliver 操作完成,我尝试制作我自己的简单邮件程序来代替使用 mail_form,使用 .deliver_now 会触发相同的错误,使用 deliver_later 则不会,但是邮件永远不会发送,所以我怀疑错误来自其他地方。

任何帮助将不胜感激,因为我在这种情况下陷入僵局

感谢评论的帮助,我能够通过 heroku 日志中的行注意到:

2022-04-28T20:35:32.116916+00:00 app[web.1]: [b1e694c5-cea3-427f-bbdd-aa3cc3a92d6b] Errno::ECONNREFUSED (Connection refused - connect(2) for 127.0.0.1:25):

正在使用的端口是 25 而不是 587 意味着块

ActionMailer::Base.smtp_settings = {
  :port           => ENV['MAILGUN_SMTP_PORT'],
  :address        => ENV['MAILGUN_SMTP_SERVER'],
  :user_name      => ENV['MAILGUN_SMTP_LOGIN'],
  :password       => ENV['MAILGUN_SMTP_PASSWORD'],
  :domain         => 'https://www.example.com/',
  :authentication => :plain,
}

被忽略了,通过将这些选项包含在 config.action_mailer.smtp_settings 中,我能够解决问题。