使用Amazon SES和Rails ActionMailer

40

如果有人仍在访问此答案,则上述宝石在JRuby中存在SSL证书验证问题(可能在JRuby之外也是如此),可以通过修改宝石来解决,方法如下:http://martinottenwaelter.fr/2010/12/ruby19-and-the-ssl-error/ - laker
10个回答

84

使用Amazon的简单邮件服务(SES)设置Rails 3.2以发送电子邮件很容易。您不需要任何额外的gem或猴子补丁即可使其正常工作。

SES支持SMTP上的STARTTLS和TLS / SSL。以下演示了如何为SES设置Rails进行STARTTLS。

先决条件

  1. 如果您正在运行Mac OS X的rails,则在使用STARTTLS之前,您可能需要正确配置Ruby的OpenSSL。如果您使用的是Ruby 1.9.3和RVM,则可以按照以下方式操作:

    rvm pkg install openssl
    rvm reinstall 1.9.3 --with-openssl-dir=$rvm_path/usr 
    

如果您不这样做,当您尝试发送电子邮件时,Ruby 可能会发生段错误。

  1. 确保您已通过 AWS 验证了发件人电子邮件地址。只有经过验证的电子邮件地址才能作为发件人发送电子邮件。在 SES 的 AWS 控制台左侧菜单中选择“已验证的发件人”选项。

  2. 确保您具有用于身份验证的 AWS SMTP 用户名和密码。在 SES 的 AWS 控制台左侧菜单中选择“SMTP 设置”选项进行设置。首先,您将被提示创建 IAM 用户(默认:ses-smtp-user),然后您将看到 SMTP 用户和密码,它们看起来像通常的 AWS 密钥和密钥。请注意,IAM 用户即 ses-smtp-user 不是您将用于身份验证的 SMTP 用户。

配置 Rails

在 config/environments/development.rb 和 config/environments/production.rb 中添加以下内容:

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
      :address => "email-smtp.us-east-1.amazonaws.com",
      :port => 587, # Port 25 is throttled on AWS
      :user_name => "...", # Your SMTP user here.
      :password => "...", # Your SMTP password here.
      :authentication => :login,
      :enable_starttls_auto => true
  }

发送电子邮件

这就是全部内容了。现在您可以创建一个邮件程序并开始为乐趣和利润发送电子邮件!

创建样例邮件程序

rails g mailer user_mailer

在 app/mailer/user_mailer.rb 文件中:

    class UserMailer < ActionMailer::Base
      # Make sure to set this to your verified sender!
      default from: "your@verifiedsender.com"  

      def test(email)
        mail(:to => email, :subject => "Hello World!")
      end
    end 

在 views/user_mailer/test.erb 中:

    A quick brown fox jumped over the lazy dog.

现在,打开控制台并发送一封测试邮件:

    rails c

    Loading development environment (Rails 3.2.1)
    1.9.3p125 :001 > UserMailer.test("your@email.com").deliver

1
感谢您提供的完整教程,SujoyGupta先生。 - FRAGA
谢谢,帮了我很多;不过有一件事,我也必须在UserMailer中设置return_path默认值。 - Neil Billingham
这样的教程就像救命稻草。 - Kasperi
access_keys 应该放在哪里? - argentum47
@sujoy Gupta,我尝试将端口更改为587,但没有成功。 - aashish
显示剩余8条评论

31

现在它无法工作。我遇到了异常:SignatureDoesNotMatch。 - ka8725
我使用 Signature V4 创建了一个新的 gem。它是用于基本 SES API 事务邮件与 Rails 集成的。https://github.com/cickes/ses_api-rails - csi

14

用于TLS SSL设置[Amazon SES推荐]

剧透:无需Gem

在Rails中发送电子邮件的默认方式为smtp,但您可以添加此行以明确定义config/application.rb文件中的内容。

config.action_mailer.delivery_method = :smtp

config/application.rb中或者你可以在某些特定的环境文件中指定

config.action_mailer.smtp_settings = {
    address: 'Amazon SES SMTP HOSTNAME',
    port: 465,   #TLS port
    domain: 'example.com',
    user_name: 'SMTP_USERNAME',
    password: 'SMTP_PASSWORD',
    authentication: 'plain',   #you can also use login
    ssl: true,   #For TLS SSL connection
}
Amazon SES SMTP主机名是每个区域特定的,因此你需要根据所在的区域选择相应的主机名。以下是各个区域对应的主机名:
  1. email-smtp.us-east-1.amazonaws.com (用于us-east-1地区)
  2. email-smtp.us-west-2.amazonaws.com (用于us-west-2地区)
  3. email-smtp.eu-west-1.amazonaws.com (用于eu-west-1地区)

StackOverFlow | Amazon-getting-started-send-using-smtp


9

在稍微探索了一下之后,我最终只是创建了一个简单的类来完成这个任务。

https://github.com/abronte/Amazon-SES-Mailer

在Rails中,您可以获取编码后的电子邮件消息:

m = UserMailer.welcome.encoded
AmazonSES.new.deliver(m)

谢谢这个。很奇怪,因为我尝试了几次,它没有正确编码正文,所以发送了一封没有内容的电子邮件。出于未知的原因,当我稍后再试时,它确实起作用了。无论如何,这个解决方案对我有用,很好知道!Amazon SES是发送电子邮件的一个非常好的新选项,而且价格非常便宜。我相信它的功能比例如SendGrid少,但如果您不特别需要它们,这似乎是一种非常实惠的选择。而且它刚刚发布,现在仅处于测试阶段。 :) - Michael van Rooijen

7
我使用以下宝石: https://github.com/aws/aws-sdk-rails 它会引入标准的aws-sdk,并允许设置ActionMailer以使用AWS SES。例如:
# config/production.rb
# ...
config.action_mailer.delivery_method     = :aws_sdk

1
这就是方法。这使我能够使用实例凭据发送电子邮件。对于V3 AWS SDK,这只是config.action_mailer.delivery_method = :ses - BenV

4

使用Amazon SES配置您的Rails应用程序

将action_mailer.perform_deliveries设置为true,因为在开发/生产环境中默认设置为false。

config.action_mailer.perform_deliveries = true

然后将此代码粘贴到您的开发/生产环境中。
config.action_mailer.smtp_settings = {
  :address => ENV["SES_SMTP_ADDRESS"],
  :port => 587,
  :user_name => ENV["SES_SMTP_USERNAME"], 
  :password => ENV["SES_SMTP_PASSWORD"],
  :authentication => :login,
  :enable_starttls_auto => true
}

0

我创建了一个简单的Rails / SES API gem,它使用Signature v4来签署请求。这最适合用于诸如联系我们、用户注册等交易性电子邮件。

Rails SES API integration gem

请随意改进并贡献。


-1

SES今天刚刚发布beta版,因此我怀疑是否有现成的gem(至少我没有看到)。您可以根据他们的开发人员文档编写自定义模块:

http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/

我知道现在问这个问题还为时过早。主要是我想使用Rails通过其邮件程序生成的MIME编码消息。 - AdamB

-1

通过使用:sendmail,我成功地在我的AWS机器上以root身份运行apt-get install postfix并使用所有默认答案来发送所有电子邮件。


-2

您可以在您的环境中为Action Mailer提供交付方式。

config.action_mailer.delivery_method = AmazonSES.deliver

目前你可能需要自己编写交付代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接