Phoenix でメールを送信する

まずは、メール用のプロジェクトの依存ライブラリである Bumboo をインストールする。

■ mix.exs
[ruby]
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
[/ruby]

mix deps.get で追加した依存ライブラリをインストールする。

[bash]
$ mix deps.get
[/bash]

プロジェクト設定ファイルに、メール設定情報を追記する。ここではSMTPサーバとしてGmailアカウントを使う。

■ config/config.exs

[ruby]
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
[/ruby]

メーラーモジュールを作成する。

■ lib/myapp/mailer.ex

[ruby]
defmodule MyApp.Mailer do
use Bamboo.Mailer, otp_app: :myapp
end
[/ruby]

メールモジュールを作成する。

■ lib/myapp/email.ex

[ruby]
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
[/ruby]

まずは、試しにコマンドラインからメールしてみる。

[bash]
$ 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"]
}
[/bash]

次に、Webアプリからメールを飛ばしてみる。コントローラを作成してルータに登録する。
ここでは、単純にページにアクセスしたら固定のメールが飛ぶ仕組み。

■ mail_controller.ex

[ruby]
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
[/ruby]

■ router.ex

[ruby]
get "/mail", MailController, :index
[/ruby]

このページにアクセスする都度にメールが飛ぶ。
ここでは、個人的な試作のためにGmailを使用しているので、SMTPサーバへのアクセスと送信はそこそこ遅い。
メールサーバを立てる方が実用的である。

This entry was posted in Elixir, Phoenix Framework, 技術情報. Bookmark the permalink.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です