SendGridを利用してEC2からWeb APIとSMTPでメールを送信してみた

SendGridを利用してEC2からメールを送信してみたいと思います。本エントリではWeb APIとSMTPのそれぞれでメールを送信してみたいと思います。
2020.03.18

SendGridを利用してEC2からメールを送信してみたいと思います。

SendGridではメールの送信方法としてWeb APIとSMTPが提供されています。本エントリではWeb APIとSMTPのそれぞれでメールを送信してみたいと思います。どちらもメール送信できる点は同様ですが、利便性等が異なりますので主な違いについては以下を確認ください。

イメージ

00

環境/前提

  • Amazon Linux 2 - ami-052652af12b58691f
  • Python 3.6.0
  • SendGridが利用可能であること

APIキー設定

メールの送信にはAPIキーが必要になりますので、APIキーを発行します。SendGridのコンソールより取得することが可能です。

Web API呼び出し元のEC2の環境変数にAPIキーを設定します。APIキーを利用する際は環境変数に設定する等して、プログラムへのハードコーディングは避けましょう。

$ echo "export SENDGRID_API_KEY='APIキー'" > sendgrid.env
$ echo "sendgrid.env" >> .gitignore
$ source ./sendgrid.env

APIキーの発行など詳細については以下を確認ください。

Web API送信

先ずは、Web APIを利用してメール送信してみたいと思います。 ここではSendGridによりサポートされているPythonのライブラリsendgrid/sendgrid-pythonを利用したいと思います。 *1

ライブラリインストール

Python用のライブラリをインストールします。

$ pip install sendgrid

送信スクリプト作成

Web APIでメールを送信するためのスクリプトです。最低限必要そうなコードで作成しました。

sendmail_api.py

import sendgrid
import os
from sendgrid.helpers.mail import *

sg = sendgrid.SendGridAPIClient(api_key=os.environ.get('SENDGRID_API_KEY'))
from_email = Email("送信元@example.jp")
to_email = To("送信先@example.jp")
subject = "Web API Test mail"
content = Content("text/plain", "This is a test email using Web API.")
mail = Mail(from_email, to_email, subject, content)
response = sg.client.mail.send.post(request_body=mail.get())
print(response.status_code)
print(response.body)
print(response.headers)

送信確認

作成したスクリプトを実行しメールを送信します。

$ python sendmail_api.py

送信が行われたかSendGridのコンソール「Activity」を確認してみます。

イベントがDeliveredになっており、受信側メールサーバに送付されていそうです。「Activity」に表示されるイベントなど詳細については以下を確認ください。

Activity

指定した送信先でメールを確認することができました。

メールを送信したはずなのに届かないときは、以下を参考に状況を確認しましょう。

SMTP送信

次は、SMTPでメールを送信してみたいと思います。SendGridのSMTP情報は以下になります。

送信スクリプト作成

SMTPでメールを送信するためのスクリプトです。最低限必要そうなコードで作成しました。

sendmail_smtp.py

import os
import smtplib
from email.mime.text import MIMEText

# SMTP認証情報
host = 'smtp.sendgrid.net'
port = 587
user = 'apikey'
passwd = os.environ.get('SENDGRID_API_KEY')
server = smtplib.SMTP(host, port)
server.starttls()
server.login(user, passwd)

# 送受信アドレス
from_email = '送信元@example.jp'
to_email = ['送信先@example.jp']
# メール本文
body = 'This is a test email using SMTP.'
message = MIMEText(body)
message['From'] = from_email
message['To'] = ",".join(to_email)
message['Subject'] = 'SMTP Test Mail'
# メール送信
server.sendmail(from_email, to_email, message.as_string())
server.quit()

ここでは送信ポートに587を利用しています。EC2から25ポートで送信する際は制限がありますのでご注意ください。

送信確認

作成したスクリプトを実行しメールを送信します。

$ python sendmail_smtp.py

指定した送信先でメールを確認することができました。

さいごに

SendGridを利用しSMTP、Web APIでメールを送信する方法をご紹介しました。

今回は利用しませんでしたがスケジュール送信など、SendGridでは送信をカスタマイズすることができます。 その際はX-SMTPAPIと呼ばれるカスタムヘッダを利用し値をJSON文字列で指定します。JSON生成を補助してくれるライブラリもあるようなので送信をカスタマイズする際に利用してみたいと思います。

脚注

  1. 7言語のライブラリが提供されています:公式ライブラリ