LoginSignup
7
5

More than 5 years have passed since last update.

Phoenixで Bambooを使用してメールを送信する

Posted at

環境

Elixir 1.6.5
Phoenix 1.3.2
Mac OS High Sierra

Bambooのインストール設定

まずは、メール用のプロジェクトの依存ライブラリである 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

Bamboo のインストール

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アプリからのメール送信

次に、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サーバへのアクセスと送信はそこそこ遅い。
メールサーバを立てる方が実用的である。

参考URL: http://www.whoocus.com/blog/?p=2655

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5