Nao000のぶろぐ

蝶を追っている少年になりたい

【Elixir Phoenix】Elixirでメール送信してくれる"bamboo_smtp"を試してみた記録

目次

  1. バージョン情報
  2. bamboo_smtpとは
  3. 使用までの流れ
  4. 参考文献

バージョン情報

Elixir: 1.8.1

Phoenix: 1.4.2

bamboo_smtpとは

Elixirでメール送信を可能とするモジュールです。

使用までの流れ

この記事ではSMTPサーバーとしてGmailを利用します。

  1. モジュールのインストール
  2. GmailのSMTPサーバーを利用できるようにする
  3. config.exsにメール設定
  4. 必要なモジュール用意
  5. 実行確認

モジュールのインストール

mix.exs に依存関係を記載し、mix deps.get します。

  {:bamboo_smtp, "~> 1.7.0"}

GmailのSMTPサーバーを利用できるようにする

アプリパスワードを生成する必要があります。アプリパスワードを利用することによって、Gmail以外のメーラーからメールを送信することが可能になります。詳しくはこちらをご参照ください。

config.exsにメール設定

アダプター、SMTPサーバー、ポート、ユーザー名、パスワードなどを設定する。最小構成が何なのかは試していません。

config :nao000dotcom, Nao000dotcom.Mailer,
  adapter: Bamboo.SMTPAdapter,
  server: "smtp.gmail.com",
  port: 587,
  username: "XXXXXXXX@gmail.com",
  password: "XXXXXXXXXXXXX",
  tls: :if_available, # can be `:always` or `:never`
  ssl: false, # can be `true`
  retries: 1

必要なモジュール用意

メール送信モジュールを用意します。Bamboo.Mailerモジュールにあるdeliver_now関数を使用します。

defmodule Nao000dotcom.Mailer do
  use Bamboo.Mailer, otp_app: :nao000dotcom
end

メール内容を用意します。宛先、差出人、件名などを設定していきます。今回は自分宛てに送信します。

本文にハッシュ値を渡していますが特に意味はありません。アカウント登録するときに「こちらのリンクをクリックして登録してください」みたいなのを実装しようかと思ってやりました。

defmodule Nao000dotcom.Email do
  import Bamboo.Email

  def send_register_account_email(hash) do
    new_email(
      to: "XXXXXXXXXX@gmail.com",
      from: "XXXXXXXXXX@gmail.com",
      subject: "Welcome to the app.",
      html_body: "
        テスト送信です。
        <br>
        https://www.nao000.com/?uid="<>hash<>"
        <br>改行タグ
      ",
      text_body: "
        テスト送信です。


      " <> hash <> "
        <br>改行タグ
      "
    )
  end
end

関数を呼び出す関数をコントローラーに用意します。別にコントローラーに書かなくても大丈夫です。

defmodule Nao000dotcomWeb.User.BlogController do
  use Nao000dotcomWeb, :controller

  def send_register_account_email do
    hash = :crypto.hash(:sha256, ["XXXXXXXXXXXX@gmail.com", "tekitounasalt"]) |> Base.encode16

    Nao000dotcom.Email.send_register_account_email(hash)   # Create your email
    |> Nao000dotcom.Mailer.deliver_now() # Send your email
  end
end

実行確認

画面更新でも実行できますが、実行の分かり易さのために対話型で実行します。

iex -S mix

~いろいろコンパイルされます~

iex(5)> Nao000dotcomWeb.User.BlogController.send_register_account_email
[debug] Sending email with Bamboo.SMTPAdapter:

%Bamboo.Email{assigns: %{}, attachments: [], bcc: [], cc: [], from: {nil, "XXXXXXX@gmail.com"}, headers: %{}, html_body: "
        テスト送信です。
        <br>
        https://www.nao000.com/?uid=617748401A04CC3227F49D3AD1B3FCBEC4360C2E7FB85D345271E746A97F23C4
        <br>改行タグ
      ", private: %{}, subject: "Welcome to the app.", text_body: "
        テスト送信です。


      617748401A04CC3227F49D3AD1B3FCBEC4360C2E7FB85D345271E746A97F23C4
        <br>改行タグ
      ", to: [nil: "XXXXXXX@gmail.com"]}

%Bamboo.Email{
  assigns: %{},
  attachments: [],
  bcc: [],
  cc: [],
  from: {nil, "XXXXXXX@gmail.com"},
  headers: %{},
  html_body: "
        テスト送信です。
        <br>
        https://www.nao000.com/?uid=617748401A04CC3227F49D3AD1B3FCBEC4360C2E7FB85D345271E746A97F23C4
        <br>改行タグ
      ",
  private: %{},
  subject: "Welcome to the app.",
  text_body: "
        テスト送信です。


      617748401A04CC3227F49D3AD1B3FCBEC4360C2E7FB85D345271E746A97F23C4
        <br>改行タグ
      ",
  to: [nil: "XXXXXXX@gmail.com"]
}
iex(6)>

受信したGmailです bamboo_smtpの実行例

参考文献