【Rails】SendGridでメール送信(2021年3月)

SendGridの仕様がもろもろ変わったっぽいので改めて使い方をまとめる。

## アカウント作成
うろ覚えだけど、日本の代理店(構造計画研究所)を通して契約すると、「サービス提供者のドメインのメールアドレスから申し込まないといけない」みたいな制約があった記憶。受託開発とかだと面倒。
なので代理店を遠さずに、以下のURLからアカウントを作成した。

https://sendgrid.com/

確認用メールが届くのでリンクを踏んで有効化。

## sender identity(差出人情報)の登録
ログイン後の画面。
![ 2021-03-26 12.11.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244893/e6bb4a75-3f91-5fae-4459-58451fbad654.png)

指示の通り、sender identityの登録を登録する。
「Create a single sender」「Authenticate a domain」の2つの方法があるけど、前者が推奨とのこと。

![ 2021-03-26 12.13.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244893/864dbd88-fae4-ad25-5214-f6ec3628a1b9.png)

表示されるフォームに情報を入力する。
![ 2021-03-26 12.15.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244893/008b1c7c-f476-ad77-19e6-aa6260b92ab4.png)

- From Name
  - 受信者に表示される差出人名
- From Email Address
  - メール送信者のメールアドレスとして表示される
  - このアドレスの持ち主かチェックするため、登録後このアドレスに確認メールが届く
      - リンク踏めばログインしなくてもverifyできる
- Reply to
  - 受信者が返信する時の宛先にセットされるアドレス
- Nickname
  - 差出人情報を一意に識別するための名前
  - この名前がメール受信者に表示されることはない

なお、このページを再度表示したい時は`Marketing Campaigns` > `Senders`からアクセスできる。

https://sendgrid.kke.co.jp/docs/Tutorials/B_Marketing_Mail/marketing_campaigns1.html

## Railsアプリからメールを送信
#### メール送信の2種類の方法
SendGridを使ったメール送信には「Web API」「SMTP」の2種類の方法がある。公式はWeb APIを推奨している。

https://sendgrid.kke.co.jp/blog/?p=5009

注意点として、Web APIを使うと、ActionMailerを使ったメール送信が難しくなる。
https://github.com/eddiezane/sendgrid-actionmailer
https://techracho.bpsinc.jp/yamada/2018_12_22/67222
上記のように、WebAPIを使いながらActionMailerで送信するgemや手法がいくつかヒットしたが、私のRails6の環境ではうまくいかなかった。

今回は、Web APIを使い、Action Mailerは使わずにメールを送信することにした。

#### APIキーを取得
- `Email API` > `Integration Guide` > `Web API` > `Ruby`を選択
- `2.Create an API key`にAPIキーの名前(なんでも良い)を入力し`Create key`をクリック
- 表示されたAPIキーを環境変数に保存

#### gemをインストール
```rb:Gemfile
gem 'sendgrid-ruby'
```
```zsh
$ bundle install
``` 

#### メール送信処理を実装
```zsh
$ touch app/models/send_email.rb
```
```rb:app/models/send_email.rb
class SendEmail
  require 'sendgrid-ruby'
  include SendGrid

  def self.test_email
    from = Email.new(email: 'dev@example.jp') # SendGridの管理画面でSenderに登録したアドレス
    to = Email.new(email: 'hogehoge@gmail.com') # 送信したいアドレス
    subject = 'テストホゲホゲ'
    content = Content.new(type: 'text/plain', value: 'ハローハロー')
    mail = Mail.new(from, subject, to, content)

    sg = SendGrid::API.new(api_key: ENV['SENDGRID_WEB_API_KEY'])
    response = sg.client.mail._('send').post(request_body: mail.to_json)
  end
end
```

#### 送信テスト
```zsh
$ rails c
> SendEmail.test_email
=> #<SendGrid::Response:0x00erererc9650
 @body="",
 @headers=
  {"server"=>["nginx"],
   "date"=>["Mon, 29 Mar 2021 02:47:15 GMT"],
   "content-length"=>["0"],
   "connection"=>["close"]
```

メールが届くことを確認

### その他
メール送信のオプションは以下のAPI仕様書を確認

https://sendgrid.kke.co.jp/docs/API_Reference/Web_API_v3/Mail/index.html

メール内のリンクがsendgrid用に置換されるのが嫌な場合、`Settings` > `Tracking` > `Click Tracking`設定から無効化できる。

https://support.sendgrid.kke.co.jp/hc/ja/articles/206253421-%E3%83%A1%E3%83%BC%E3%83%AB%E6%9C%AC%E6%96%87%E5%86%85%E3%81%AEURL%E3%81%8C%E5%8B%9D%E6%89%8B%E3%81%AB%E7%BD%AE%E6%8F%9B%E3%81%95%E3%82%8C%E3%81%A6%E3%81%97%E3%81%BE%E3%81%84%E3%81%BE%E3%81%99-%E8%A7%A3%E9%99%A4%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B-