使用 ActionMailer 和 Outlook/Mandrillapp SMTP 服务器发送邮件

Posted

技术标签:

【中文标题】使用 ActionMailer 和 Outlook/Mandrillapp SMTP 服务器发送邮件【英文标题】:Sending mail with ActionMailer and Outlook/Mandrillapp SMTP server 【发布时间】:2013-08-20 06:32:53 【问题描述】:

我正在使用ActionMailer 在我的应用程序中为“联系我们”表单发送邮件。 我正在使用 Mandrill 应用程序发送我的电子邮件。这些是我的设置:

config/environments/development.rb

  config.action_mailer.perform_deliveries = true 
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = 
    :address              => "smtp.mandrillapp.com",
    :port                 => 587,
    :enable_starttls_auto => true,
    :user_name            => 'SMTP username i.e Mandrill a/c username',
    :password             => 'API key for development',
    :domain               => 'example.com',
    :authentication       => 'plain'
  

config/environments/production.rb

我已删除该行config.action_mailer.raise_delivery_errors = true 并更改了生产密码 - 这是用于生产的 Mandrill 应用程序 API 密钥。

app/mailers/contactus_mailer.rb

class ContactusMailer < ActionMailer::Base

  default :from => "noreply@example.com"
  default :to => "help@example.com"

  def new_message(message)
    @message = message
    mail(:subject => "[WebsiteName] #message.name + " - " + message.email")
  end

end

上述帐户在自定义域上的有效性 - example.com

上述电子邮件帐户,即noreply@example.comhelp@example.com 已配置且功能齐全。上述帐户是在 Outlook.com 上设置的,我还仔细检查了我的域 example.com 的 MX 记录,并且我的域的域设置是活动的。作为证明,我可以从两个帐户发送/接收电子邮件。

开发和生产环境日志:

当我在两种环境中使用“联系我们”表单时,ActionMailer 不会报告任何错误并成功重定向到主页。

Started POST "/contact" for 127.0.0.1 at 2013-08-18 12:35:37 +0530
Processing by MessagesController#create as html
  Parameters: "utf8"=>"✓", "authenticity_token"=>"UNgMrA04yk4sIbqtXjlLvLvDINgrBT5eP0wMSRYNgPs=", "message"=>"name"=>"Dummy name", "email"=>"abc@pqr.com", "content"=>"Random body", "commit"=>"Send Message"
  Rendered contactus_mailer/new_message.text.erb (0.5ms)

Sent mail to help@example.com (2679ms)
Date: Sun, 18 Aug 2013 12:35:38 +0530
From: noreply@example.com
To: help@example.com
Message-ID: <52107242dbf6c_12a7f3fd8b1835ad03979@Jatins-MacBook-Pro.local.mail>
Subject: [WebsiteName] Dummy name - abc@pqr.com
Mime-Version: 1.0
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

Name: Dummy name    
Email: abc@pqr.com
Body: Random body

Redirected to http://localhost:3000/
Completed 302 Found in 3841ms (ActiveRecord: 0.0ms)

生产环境的 Mandrill App API 日志:

完整请求:


    "from_email": null,
    "from_name": null,
    "async": false,
    "key": "API key for production",
    "raw_message": "Received: from example.com (unknown [23.20.245.109])\n\t(Authenticated sender: key_production@gmail.com)\n\tby ip-10-31-147-25 (Postfix) with ESMTPSA id 6811A151A064\n\tfor <help@example.com>; Sun, 18 Aug 2013 08:19:11 +0000 (UTC)\nDate: Sun, 18 Aug 2013 08:19:11 +0000\nFrom: noreply@example.com\nTo: help@example.com\nMessage-ID: <5210837f5ce24_26e56b87992f@5c11fd99-5533-4855-af78-40e02c939412.mail>\nSubject: [WebsiteName] Dummy name - abc@pqr.com\nMime-Version: 1.0\nContent-Type: text/plain;\n charset=UTF-8\nContent-Transfer-Encoding: 7bit\n\nName: Dummy name\n\nEmail: abc@pqr.com\n\nBody: Random body",
    "to": [
        "help@example.com"
    ]

完整回复:

[
    
        "email": "help@example.com",
        "status": "rejected",
        "_id": "9c9f88c588ee4f369437b8dd5d531c8c",
        "reject_reason": "soft-bounce"
    
]

Mandrill App API 开发环境日志:

开发环境的完整请求。类似于生产环境。但是,在开发中,反应是不同的。 完整回复:

[
    
        "email": "help@example.com",
        "status": "sent",
        "_id": "e67f31f893a84ecdb0ed2438e5741ce1",
        "reject_reason": null
    
]

注意:在开发和生产环境中,我的帐户 help@example.com 都没有收到电子邮件。查询:

    为什么我在生产环境中收到拒绝状态和软退回拒绝原因,而对于开发,它显示已发送状态并且没有拒绝原因。

    为什么在这两种情况下我都没有收到任何邮件?

附言 最初,我没有使用Mandrill app,而是使用smtp.live.com 作为我的SMTP 服务器以及我的no reply@example.com 凭据,但这并没有成功。 然后我在 Google 上进行了一些挖掘后切换到 Mandrill。 如果有人可以帮助设置 Outlook 邮件,那也一样好。这样一来,Mandrill 就完全不需要了。

【问题讨论】:

【参考方案1】:

无论有没有 Mandrill,我都能让它工作。直到 7 天后我才收到任何电子邮件,我的收件箱里塞满了我所有的测试电子邮件。

似乎我的 DNS、我的电子邮件帐户的 TXT 记录出现了故障,这导致了延迟。

在没有 Mandrill 的情况下也尝试过,并且邮件可以正常发送。因此,在此处发布 Outlook 的设置。可能对其他人有用。

  config.action_mailer.perform_deliveries = true 
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = 
   :address              => "smtp.live.com",
   :port                 => 587,
   :enable_starttls_auto => true,
   :user_name            => 'noreply@example.com',
   :password             => 'password',
   :domain               => 'example.com',
   :authentication       => 'plain'
 

注意:要在生产环境中使用,请将 raise_delivery_errors 设置为 false

【讨论】:

我正在使用这个确切的设置,但我收到了一个 ssl 错误。你有ssl证书吗?为您的域? @TommyAdey:不。我没有 SSL 证书。你能解释一下你的问题吗? 我的说 OpenSSL::SSLError - SSL_read: 错误的版本号。我已经尝试了几天,但它仍然没有工作。我也试过:openssl_verify_mode => 'none'。 @TommyAdey:抱歉,我在该领域没有太多专业知识。我建议您在 SO 上发布一个新问题以寻求帮助。 好的,没问题。谢谢。【参考方案2】:

你有吗

config.action_mailer.default_url_options =  
  :host => 'YOUR_HOST_NAME_HERE'
   

application.rbproduction.rb 中定义?它应该设置为您的域名。我发现有些服务器会拒绝没有明确定义主机名的邮件。

【讨论】:

谢谢,但这是我的 TXT 记录的一个暂时性问题,导致邮件延迟。

以上是关于使用 ActionMailer 和 Outlook/Mandrillapp SMTP 服务器发送邮件的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4 ActionMailer - 如何在使用 Deliver_later 时捕获连接和 SMTP 错误

集成测试ActionMailer和ActiveJob

使用 ActionMailer 发送多部分邮件时出现问题

问:如何使用 Turnip、capybara 和 Gherkin 测试 ActionMailer Deliver_later

设计不通过ActionMailer发送电子邮件

使用 ActionMailer 的电子邮件注册确认