まずは、メール用のプロジェクトの依存ライブラリである Bumboo をインストールする。
■ mix.exs
def application do [ mod: {MyApp.Application, []}, extra_applications: [:logger, :runtime_tools, :bamboo] ] end defp deps do [ {:phoenix, "~> 1.3.2"}, {:phoenix_pubsub, "~> 1.0"}, {:phoenix_ecto, "~> 3.2"}, {:mariaex, ">= 0.0.0"}, {:phoenix_html, "~> 2.10"}, {:phoenix_live_reload, "~> 1.0", only: :dev}, {:gettext, "~> 0.11"}, {:cowboy, "~> 1.0"}, {:bamboo, "~> 0.7"}, {:bamboo_smtp, "~> 1.2.1"} ] end
mix deps.get で追加した依存ライブラリをインストールする。
$ mix deps.get
プロジェクト設定ファイルに、メール設定情報を追記する。ここではSMTPサーバとしてGmailアカウントを使う。
■ config/config.exs
config :myapp, MyApp.Mailer, adapter: Bamboo.SMTPAdapter, server: "smtp.gmail.com", port: 587, username: "my@gmail.com", password: "password", tls: :if_available, # can be `:always` or `:never` ssl: false, # can be `true` retries: 1
メーラーモジュールを作成する。
■ lib/myapp/mailer.ex
defmodule MyApp.Mailer do use Bamboo.Mailer, otp_app: :myapp end
メールモジュールを作成する。
■ lib/myapp/email.ex
defmodule MyApp.Email do use Bamboo.Phoenix, view: MyApp.EmailView def hello_email(email) do new_email |> to(email) |> from("my@gmail.com") |> subject("Welcome!") |> text_body("Welcome to My App!!") end end
まずは、試しにコマンドラインからメールしてみる。
$ iex -S mix Interactive Elixir (1.6.5) - press Ctrl+C to exit (type h() ENTER for help) iex(1)> MyApp.Email.hello_email("tajima@whoocus.com") |> MyApp.Mailer.deliver_now [debug] Sending email with Bamboo.SMTPAdapter: %Bamboo.Email{assigns: %{}, bcc: [], cc: [], from: {nil, "my@gmail.com"}, headers: %{}, html_body: nil, private: %{}, subject: "Welcome!", text_body: "Welcome to My App!!", to: [nil: "tajima@whoocus.com"]} %Bamboo.Email{ assigns: %{}, bcc: [], cc: [], from: {nil, "my@gmail.com"}, headers: %{}, html_body: nil, private: %{}, subject: "Welcome!", text_body: "Welcome to My App!!", to: [nil: "tajima@whoocus.com"] }
次に、Webアプリからメールを飛ばしてみる。コントローラを作成してルータに登録する。
ここでは、単純にページにアクセスしたら固定のメールが飛ぶ仕組み。
■ mail_controller.ex
defmodule MyApp.MailController do use MyApp, :controller alias MyApp.Mailer def index(conn, _params) do MyApp.Email.hello_email("tajima@whoocus.com") |> Mailer.deliver_now render conn, "index.html" end end
■ router.ex
get "/mail", MailController, :index
このページにアクセスする都度にメールが飛ぶ。
ここでは、個人的な試作のためにGmailを使用しているので、SMTPサーバへのアクセスと送信はそこそこ遅い。
メールサーバを立てる方が実用的である。