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
関連記事
- レイアウトおよび部分テンプレートに関するまとめ (Rails4)レイアウトおよび部分テンプレートはどちらもテンプレート (*.html.erb) に共通の要素をまとめておき、任意のテンプレートから利用できるようにしておくための仕組みです。フッターやヘッダーといった大枠はレイアウト、小さなパーツは部分テンプレートというイメージで使い分けましょう。 レイアウトの使用方法 クラス毎に指定する方法と、アクション毎に指定する方法があります。 app/views/layo...
- Ruby コードスニペット (正規表現)sample.rb str = "001: This is a string." var1,var2 = 2,3 # 'EOS'とすると#{}による変数展開がなされない (%03dは展開される) doc = (<<"EOS" % var1) # 括弧は省略可。要は<<"EOS"の次の行からEOSまで。(参: <<-"EOS"とすると前に空白...
- OAuthを用いずにTwitterに自動投稿する (回数制限あり, Selenium with Ruby)Seleniumを用いて、OAuthを用いずにTwitterに自動投稿するRubyスクリプトを記述してみます。連続で複数回実行すると、ボット判定としてキャプチャ認証が発生します。その認証までは通過できませんので悪しからず。また、Twitterの仕様変更次第ではDOMの構造が変化するため、下記サンプルは機能しなくなる恐れが有ります。 twitter_post.rb #!/usr/bin/ruby r...
- Ruby における日本語のエンコーディング日本語を含めて多言語対応する際には、Asciiコード以外の文字コードセットが必要になります。日本語が主となる場合、よく使われる文字セットにはUnicode, Shift_JIS, EUC-JPがあります。このうち Unicode だけは特殊であり、世界中のあらゆる文字を収録しようとしていることから 1 文字を表現するために必要なバイト数が大きくなってしまっています。そのため Unicode のうち...
- Rails3ビューテンプレートの基本的な使用方法 (Ruby)Railsでは、ERB (eRuby (テキストファイルにRubyスクリプトを埋込む書式の仕様) をRubyで実装したもの) を用いてHTML内にRubyスクリプトを埋込むことができます。 <% %> で囲むと出力されません (if-elseなど制御構文を記述します) <%= %> で囲むとエスケープ出力されます <%== %> で囲むとエスケープされずに...