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

results matching ""

    No results matching ""