メール送信の方法 (Rails4/ActionMailer)
[履歴] [最終更新] (2015/08/24 06:24:50)
最近の投稿
注目の記事

概要

Railsに標準で搭載されているActionMailerという仕組みを利用してメール送信を行う方法を記載します。

必要なファイルの自動生成

以下のコマンドで必要なファイルを自動生成します。

$ rails generate mailer MyMailer method_name

実行結果例

create  app/mailers/my_mailer.rb
invoke  erb
create    app/views/my_mailer
create    app/views/my_mailer/method_name.text.erb
invoke  test_unit
create    test/mailers/my_mailer_test.rb

設定ファイルの更新

環境毎に用意されている設定ファイルに、ActionMailerの設定項目を追記します。Developmentの場合の例を以下に記載します。

config/environments/development.rb

MyApp::Application.configure do
  ...

  config.action_mailer.delivery_method = :smtp  # SMTPを利用
  config.action_mailer.raise_delivery_errors = true  # 送信できない場合に例外を発生させる
  config.action_mailer.default_url_options = { host: 'www.example.com' }  # 後述のURL生成時に使用する自サイトのホスト
  config.action_mailer.smtp_settings = {
    address: 'smtp.example.com',  # SMTPサーバの設定
    port: 587,
    domain: 'example.com',  # ドメイン部分
    user_name: 'USERNAME',
    password: 'PASSWORD'
  }
end

ヘッダ情報などの設定

件名を含め、ヘッダ情報は以下のように指定します。

app/mailers/my_mailer.rb

class MyMailer < ActionMailer::Base
  default from: "from@example.com",  # 共通のヘッダ情報はここに記述
          reply_to: "reply_to@example.com",
          charset: 'UTF-8'

  # Subject can be set in your I18n file at config/locales/en.yml
  # with the following lookup:
  #
  #   en.my_mailer.method_name.subject
  #
  def method_name(arg)
    @arg = arg
    @greeting = "Hi"

    # ↓添付ファイルを指定する場合
    attachments['sample.jpg'] = File.read(Rails.root.join('path/to/sample.jpg'))

    # ↓メソッド別のヘッダ情報はここに記述。他にbccなども指定可能
    mail (to: "to@example.org", cc: "cc@example.org", subject: '件名')
  end
end

環境によって宛先などのヘッダ情報を変更したい場合は

Rails.env.development?
Rails.env.production?

によって条件分岐を記述すればよいです。

メール本文のテンプレート

自動生成されている「app/views/my_mailer/method_name.text.erb」を編集します。一般のビューファイルと同じ記法が使用できます。例えば、"MyMailer" からの引数を利用するためには以下のようにします。

<%= @arg.value %>

また、URLを生成するには

<%= url_for(host: 'www.example.com', controller: :my_models, action: :index) %>

とします。「config/environments/development.rb」で指定した "host" を利用する場合は単に

<%= url_for(controller: :my_models, action: :index, only_path: false) %>

と記述できます。

コントローラからの実行

以上の "MyMailer" を利用してメールを送信するためには、コントローラ内で以下のように記述します。

def sendmail
  arg = MyModel.find(1)
  @mail = MyMailer.method_name(arg).deliver
  render text: 'メール送信完了'
end
関連ページ
    概要 外部の SMTP サーバを直接指定して利用するスクリプト Rubyでメール作成および送信を行うためのサンプルプログラム メール送信の方法 (Rails4/ActionMailer) の場合は気になりませんが、無指定の場合や mail コマンドなどは、ローカルホストの SMTP サービスを利用しようとします。そのような場合のために、SMTP サービスの Postfix デーモンをロー