如何使用ActionMailer发送带有AWS SES的电子邮件

ach*_*322 1 ruby ruby-on-rails actionmailer amazon-web-services ruby-on-rails-4

我正在尝试使用html模板发送邀请电子邮件.目前我正在使用像这样的aws-ses gem:

  ses = AWS::SES::Base.new(
      :access_key_id     => 'XXXXXXXXXXXXXXX',
      :secret_access_key => 'XXXXXXXXXXXXXXX')
  ses.send_email(:to => ..., :source => ..., :subject => ..., :html_body => <p> Hi how are you</p>)
Run Code Online (Sandbox Code Playgroud)

我将html代码作为字符串发送到:html_body.这很好用.

我想要做的是使用一个模板,并将其存储在一个单独的文件中,例如invite_email.html.erb,该文件将存储在其中app/views/user_mailer/.

所以我想我必须使用动作邮件来使用渲染视图.我设置动作邮件程序以使用AWS :: SES gem,并按照rails指南设置动作邮件程序rails g mailer UserMailer.我有一个UserMailer,一个布局,我重新启动了服务器.我developement.rb看起来像这样:

  config.action_mailer.perform_deliveries = true
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :ses
Run Code Online (Sandbox Code Playgroud)

:ses在这样初始化initializers/action_mailer.rb:

ActionMailer::Base.add_delivery_method :ses, AWS::SES::Base,
                                   access_key_id: 'XXXXX',
                                   secret_access_key: 'XXXXX'
Run Code Online (Sandbox Code Playgroud)

服务器响应: UserMailer#invite_email: processed outbound mail in 184.0ms

问题是,我仍然没有收到任何电子邮件.我在测试环境中尝试使用相同的设置在environments/test.rb另一台机器上,但仍然没有电子邮件.服务器显示正在呈现布局并正在处理电子邮件.我错过了一个设置吗?

bro*_*lav 5

我正在使用以下方法来ActionMailer使用AWS SES发送电子邮件.我在fog-aws gem 周围创建了一个简单的包装器,并添加了类似于你在问题中使用的传递方法.我决定使用fog-awsgem,因为它允许我使用IAM角色而不是明确指定访问凭证.

我创建了lib/aws/ses_mailer.rb包含以下内容的文件:

module AWS
  class SESMailer
    attr_reader :settings

    def initialize(options = {})
      @fog_mailer = Fog::AWS::SES.new(options)
      @settings = {}
    end

    delegate :send_raw_email, to: :@fog_mailer

    alias_method :deliver!, :send_raw_email
    alias_method :deliver, :send_raw_email
  end
end
Run Code Online (Sandbox Code Playgroud)

然后添加交货方式config/initializers/amazon_ses.rb:

ActionMailer::Base.add_delivery_method :ses, AWS::SESMailer, use_iam_profile: true
Run Code Online (Sandbox Code Playgroud)

然后为特定环境启用它:

config.action_mailer.delivery_method = :ses
Run Code Online (Sandbox Code Playgroud)

现在您可以使用AWS SES发送电子邮件.

  • 坚实有用的答案; 只是一些可能的澄清:为了使IAM角色与ec2实例动态关联,实例必须在VPC中启动,而不是经典的ec2模式.另外,如果您使用除了amazon linux之外的任何其他AMI,或者处理它的第三方市场ami,则默认情况下不安装aws工具,并且必须发生以便实例获得iam角色. (3认同)