IBM Cloud上のSendGrid（メール配信サービス）を使用して、Pythonからメールを送信する



## はじめに

‐　**達成したいこと**
VPC内のサーバーからメールを送信することです。短期間の利用を想定しているため、手軽に利用できるサービスが理想です。

‐　**SendGridを使用してメール送信を実現**

IBM Cloudのメニューには「Email Delivery」というサービスがあります。これは、サードパーティ製品のSendGridに基づいています。IBM Cloudのカタログページには、5分で使い始められるといった手軽さについての説明もあります。

環境はこのように構成します。料金を節約するため、VPCサーバーはローカルPCでシミュレーションして、Pythonコードを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/9ee63fa9-66c6-0083-2854-00028ea7c29b.png)


## 実現方法 _ SendGridサービスの設定

**設定の流れ**
1. IBM Cloud Portal: SendGrid Accountの作成
2. SendGrid Portal: Sender Identityの作成
3. SendGrid Portal: Setup Guideより設定


### 1. IBM Cloud Portal: SendGrid Accountの作成について

IBM Cloud Portalでは、**Classic Infrastructure** ➝ **Services** ➝ **Email Delivery**にアクセスし、**Order Email Delivery Service**ボタンをクリックします。
新規作成の画面で、
‐　**Email Address**：こちらのEmail AddressはSendGrid Accountに関連付けられ、有効なアドレスであるかどうかの確認は行われません。実際にメールを送信する際に使用される『送信元』のメールアドレスではありません。
‐　**Plan**：月に3000通のメールを無料で送信できるFree Packageプランを利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/ccf3411c-30fa-047e-b5d7-6a464894f350.png)

**Create**ボタンをクリックして、すぐにAccountの作成が完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/a6b93712-691b-e362-ed4e-5987e3e10ad4.png)


IBM Cloud Portalでは、Planの変更とサービスのキャンセルのみ操作でき、その他の設定はSendGridの画面で行う必要があります。**Vendor Portal**をクリックすると、SendGrid PortalにSSO（Single Sign-On）でアクセスできます。つまり、現在は、SendGridのユーザー名やパスワードを入力する必要はありません。

### 2. SendGrid Portal: Sender Identityの作成について

最初にSendGridのPortalをアクセスする際に、自動的にSetup Guideが表示されます。(ダッシュボード画面からいつでもSetup Guideを開くことができます。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/f509da68-33ca-8537-a976-53fefb57a159.png)

SendGrid 経由でメールを送信するには、送信元のメールアドレスが有効であることを確認する必要があります。そのため、送信元メールアドレスごとにSender Identityを作成する必要があります。

Setup Guide画面の**Create sender identity**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/42296d2b-608c-ffb1-bec4-84bfe84c688a.png)

詳細画面で送信元のメールアドレス情報を入力し、**Create**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/41df1f3e-6721-6ab8-e576-6282906c85aa.png)

このメールアドレスに確認メールが送信されます。確認すると、Sender Identity が「VERIFIED」の状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/8d5af75b-49cc-794c-73be-cb15ac857b9f.png)

### 3. SendGrid Portal: Setup Guideより送信方法の設定について

次に、Setup Guideに従って、送信環境に応じてメールを送信する方法を確認・設定します。

Setup Guideの画面に戻り、**Use Web API or SMTP** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/2cb5d0d4-d181-b58d-767d-1031168511b3.png)

**Web API**を選択します。（お勧めの方法です。） 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/c9e97938-124e-5bde-e990-1c0035d55fa0.png)

送信側の開発言語を選択します。こちらはPythonになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/efbe24aa-dc19-f84c-f344-c6d3a506a1d4.png)

SendGridのWeb APIをアクセスするためのAPI Keyを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/b639d184-4c48-13fa-3c53-0522c9317d00.png)

API Keyが作成したら、次の環境変数の設定CLIも自動的に更新されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/5ad90a13-7576-0bbc-bbb4-c21c40a57b2f.png)

これでSendGrid Portalでの設定が完了です。

## 実現方法 _ ローカルPCでのPythonコードの説明

Sendguide PortalでのSetup Guideには、ローカルPCでPython環境をセットアップする方法に関する情報が記載されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/915cac16-9cdc-35d5-4aaa-397f3faa4aea.png)

簡単に言いますと、次のことが必要です:
- API KeyをローカルPCのenvとして設定します。
- pipコマンドでsendgrid パッケージをインストールします。
- メールを送信するためのPythonコードを準備します。

Setup Guideには、Sampleコマンドが記載されており、参考すれば問題ないと思いますが、ここで特に送信するためのPython コードについて、少し説明します。
```
import os
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail

message = Mail(
    from_email='from_email@example.com',　　　　　#送信元のメールアドレス。Sender Identityに登録することが必要
    to_emails='to@example.com',　　　　　　　　#送信先のメールアドレス
    subject='Sending with Twilio SendGrid is Fun',
    html_content='<strong>and easy to do anywhere, even with Python</strong>')
try:
    sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
    response = sg.send(message)
    print(response.status_code)
    print(response.body)
    print(response.headers)
except Exception as e:
    print(e.message)
```


## 効果を確認

Pythonコードを実施し、宛先のメールボックスで受信状況を確認します。via sendgrid.netという情報が表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/c373fb1d-c6af-f775-ea39-31a6c7dc1b2b.png)

もし受信されていない場合：
- ジャンクフォルダを確認してみましょう。
- SendGrid Portalで送信Activityを確認しましょう。Complianceの原因でBlockされた可能性があります。例えば、私の会社のメールアドレスがこのような外部サービスより送信することが許可されていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/59385521-d62a-50cd-6b79-c44529d7d881.png)



## 他には

### 参考資料：

- FAQ in IBM Cloud Doc:https://cloud.ibm.com/docs/email-delivery?topic=email-delivery-email-delivery-faq
- 外部公開のSendGrid Github Repository: https://github.com/sendgrid/sendgrid-python

### Supportについて：

SendGridは、実はTwilio会社が提供しているサービスです。問い合わせの際には、IBM Cloudのサポートケースではなく、SendGridへサポートケースを起票することになります。
起票するURL：https://support.sendgrid.com/hc/en-us
（英語のみのようです。）