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