Elixir + SendGrid でメール送信してみる

# Elixir + SendGrid でメール送信！
fukuoka.ex の Koyo です！
(この記事は「[fukuoka.ex Elixir／Phoenix 2021 Advent Calendar](https://qiita.com/advent-calendar/2021/fukuokaex)」の7日目です)

https://qiita.com/advent-calendar/2021/fukuokaex

ログイン時の認証とかでメール送信したいときありますよね。
今回は Elixir(Swoosh) + SendGrid の組み合わせでメール送信を試してみようと思います！

## Elixirバージョン
```
 $ elixir -v
Erlang/OTP 24 [erts-12.0.4] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit]

Elixir 1.12.2 (compiled with Erlang/OTP 22
```
## Swoosh
Phoenix 1.6 からは phx.gen.auth を使うことでメール送信機能付きの認証システムが一通り揃うようになっています。

その中では Swoosh というメール送信クライアントのライブラリが使われています。
Adapter が提供されており、SaaSを使ったりローカルから送信したりと様々にカスタマイズできます。

https://github.com/swoosh/swoosh

https://hexdocs.pm/swoosh/Swoosh.html

今回はその中でも SendGrid を用いてみようと思います

## SendGrid

SendGrid は広く使われているメール配信の SaaS です。
Web APIが提供されており、アプリケーションからの利用が簡単に行えますね。

https://sendgrid.kke.co.jp/

無料でも12000通/月を送ることができるので、今回はそれを使ってみます。

https://sendgrid.kke.co.jp/plan/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/330d8790-ac55-ee6a-64f3-3b8f0ee265f3.png)

# やってみる
## SendGrid の登録 ※1日以上かかる

右上の「無料で始める」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/17c3a4e3-c94c-e8f6-39a7-706568c53209.png)

このようなフォームが出るので、必要事項を入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/d6b0e449-acbe-3383-c9ef-2eaa79513af2.png)

なおアカウント登録には審査が必要なので **1営業日** ほどかかるので注意！

登録完了後にアカウント情報が送られてくるのでログインして Settings -> API Keys の画面を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/dd495eed-344f-b621-ade9-9d1f98abe1a8.png)

APIキーを作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/9f57c176-76dc-7613-ee18-5ed686d7a2c5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/e72dd90c-6b73-df42-1eb5-388f7b34cda2.png)

これで SendGrid 側の準備は完了です！

## Elixir

今回は Phoenix を使わずに素の mix プロジェクトでやってみます。
Phoenix でも同様にすれば使えると思うので、参考にしてみてください。

```
$ mix new email_sample
```

```elixir:mix.exs
  # Run "mix help deps" to learn about dependencies.
  defp deps do
    [
      {:swoosh, "~> 1.5"},
      {:hackney, "~> 1.9"}
    ]
  end
```

※ config は自動で作られないのでディレクトリとファイルを作ります

```
$ mkdir config
$ touch config/config.exs
$ mkdir lib/email_sample
$ touch lib/email_sample/mailer.ex
```

先ほど作成したAPIキーを入れてください↓

```elixir:config/config.exs
import Config

config :email_sample, EmailSample.Mailer,
  adapter: Swoosh.Adapters.Sendgrid,
  api_key: "SG.x.x" # 自分のAPIキーを入力
```

```elixir:lib/email_sample/mailer.ex
defmodule EmailSample.Mailer do
  use Swoosh.Mailer, otp_app: :email_sample
end
```

メール送信内容を組み立てます！
to/from は自分のメールアドレスを入力してくださいね！

```elixir:lib/email_sample.ex
defmodule EmailSample do
  import Swoosh.Email

  def email do
    new()
    |> to("xxxxx@gmail.com")
    |> from({"Koyo", "xxxxx@gmail.com"}) # 登録時に記載した送信元 Emailアドレス
    |> subject("Test email")
    |> text_body("Hello from Koyo\n")
  end
end
```

## 実行！

ドキドキの実行...

```elixir
$ iex -S mix
iex(1)> EmailSample.email |> EmailSample.Mailer.deliver 
{:ok, %{id: "iNX0QMPBQR6Fv_phRhOXIg"}}
```

Gmailを見てみます...届いている！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/841b80b3-63e0-6327-aadb-5f87ad3be343.png)

# まとめ
Elixir(Swoosh) + SendGrid の組み合わせでメール送信をしてみました。
実際には Phoenix アプリケーションで使うことが多いと思いますが、今回の内容を参考にすれば同様にできるかと思います。

たったこれだけでメール送れるのすごい時代ですね！
Elixir だとサクサクっと作れるので、みなさんも是非試してみてください！
自分が作ったアプリケーションからメールを送れるので、色々遊べそうですね！

今回使用したリポジトリは↓においてます。APIキーとかメールアドレスを自分のものに設定すれば動くと思いますので、ぜひ使ってみてください。

https://github.com/koyo-miyamura/sendgrid_sample_ex