6.1 Action Mailerの設定
メールサーバを指定する
ActionMailerでは送信に使うメールサーバをしていすることができます。 以下の例ではGmailを送信サーバーとして設定する例です。
config.action_mailer.delivery_method = :smtp # 送信プロトコル
config.action_mailer.smtp_settings = {
address: 'smtp.gmail.com',
port: 587,
domain: '256.tips',
user_name: 'railstips',
password: '1234567890',
authentication: 'text/html',
enable_starttls_auto: true
}
メイラーを作成する
ActionMailer
はRailsのジェネレータを使って生成することができます。以下のコマンドでメイラーを生成することができます。
$ rails g mailer PostMailer
Running via Spring preloader in process 38765
create app/mailers/post_mailer.rb
invoke erb
create app/views/post_mailer
invoke test_unit
create test/mailers/post_mailer_test.rb
create test/mailers/previews/post_mailer_preview.rb
生成されたメイラーは以下のようになります。
class PostMailer < ApplicationMailer
end
メイラーレイアウトを設定する
メイラーのビューで使うレイアウトを変更するにはlayout
メソッドを利用します。
class PostMailer < ApplicationMailer
layout 'mailer' # mailer.html.erbをレイアウトとして使用する
end
メイラービューを作成する
メイラーのビューはapp/views/<メイラーのクラス>
ディレクトリに配置します。
コントローラと同様、メイラーで定義したアクション名がビューのファイル名になります。
class PostMailer < ApplicationMailer
default from: '[email protected]'
def published_email(post)
@post = post
mail(
to: @post.user.email,
subject: '投稿が公開されました'
)
end
end
上のようなメイラーが定義されている場合以下のビューが呼ばれます。
app/views/posts/published_email.html.erb
<p>「<%= @post.title %>」が公開されました</p>
ビューでリンクを生成する
メイラーのビューでは*_path
ヘルパーは利用できないので*_url
ヘルパーを利用します。
app/views/posts/published_email.html.erb
<p>「<%= link_to @post.title, post_url(@post) %>」が公開されました</p>
上の例ではpostのタイトルをリンクにしています。
ファイルを添付する
Action Mailerでファイルを添付するにはattachments
にファイル名とファイルを渡すと添付されます。以下の例ではresume.pdf
という名前でファイルのパスを指定しています。
attachments['resume.pdf'] = File.read('./resume.pdf')
ファイルをエンコードする
ActionMailerのデフォルトではBase64
でエンコードされますが、他の方法でエンコードすることも可能です。
他の方法でエンコードをするにはattachments
にファイル、エンコード方法、ヘッダーを含むハッシュを渡すことで可能です。
encoded_content = SpecialEncode(File.read('./resume.pdf'))
attachments['resume.pdf'] = {
mime_type: 'application/x-gzip',
encoding: 'SpecialEncoding',
content: encoded_content
}
メールを複数の相手に送信する
メイラーのto:
、cc:
、bcc:
オプションに送信先のメールアドレスのリストを渡すことによって複数の宛先を指定することができます。
以下の例ではユーザーのフォロワー全員に新規の投稿が公開されたことを通知します。
class PostMailer < ApplicationMailer
default from: '[email protected]'
def published_email(post)
@post = post
mail(
to: @post.user.followers.pluck(:email),
subject: '投稿が公開されました'
)
end
end
メールアドレスを名前で表示する
相手のメールクライアントで自分のメールアドレスではなく名前を表示させたい場合は"名前 <メールアドレス>"
の形式で指定します。
以下の例では投稿したユーザーの名前を表示しています。
class PostMailer < ApplicationMailer
default from: '[email protected]'
def published_email(post)
@post = post
mail(
from: "#{@post.user.name} <[email protected]>",
to: @post.user.followers.pluck(:email),
subject: '投稿が公開されました'
)
end
end
メイラーでメールを送信する
class PostMailer < ApplicationMailer
default from: '[email protected]'
def published_email(post)
@post = post
mail(
to: @post.user.email,
subject: '投稿が公開されました'
)
end
end
上のようなメイラーが定義されていた場合、メイラーを呼び出すには以下のようになります。
PostMailer.published_email(@post)
メイラーは任意の場所で呼び出すことができるので、今回の例であれば投稿が公開された時点で送信される必要があります。その場合の例は以下になります。
class PostsController < ApplicationController
def published
@post = Post.find(params[:id])
@post.published! # 投稿を公開する処理
PostMailer.published_email(@post) # メールを送信
end
end