🐥

SendGridにAPIでメール送信

2019/04/16に公開

概要

各クラウドサービスともにIPアドレスが変動する関係上、MTAを構築するのは非推奨になっている事が多く、その代替案としてSendGridというメール送信用のSaaSの利用を推奨している。

SMTPにも対応しているがPostfix等が無い環境でも使えるように、公式ライブラリも提供されているPythonで手軽にメール送信出来るスクリプトを作成する。

SendGridの登録やAPI_KEYは作成済みとする。
(送信用のスパム対策等の理由により、ドメイン所有確認など登録完了までに少々時間を要するので注意)

下準備

pip install sendgrid

API_KEYなどセキュアな情報も多いので環境変数としてデフォルト値を設定。

# 環境変数設定
export FROM_ADDRESS=hoge@example.com
export TO_ADDRESS=huga@example.com
export SUBJECT="this is test mail"
export API_KEY=SEND_GRID_API_KEY

設定ファイルを用意してsourcedotenvで読み込んでも良い。

source ./sendgrid.env

コード

以下、雑にコード。

#!/usr/bin/env python3
import os
import sys
import argparse
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail

def get_args():
# 引数取得
    parser = argparse.ArgumentParser()

    # 通常の引数指定
    if sys.stdin.isatty():
        parser.add_argument("message", help = "Mail Message", type = str)
    # パイプライン経由
    else:
        parser.add_argument("message", help = "Mail Message", nargs = "?", type = str, default = sys.stdin.read())

    parser.add_argument("-f", help = "Send from Address", default = os.environ.get('FROM_ADDRESS'))
    parser.add_argument("-t", "--to", help = "Send to Address", default = os.environ.get('TO_ADDRESS'))
    parser.add_argument("-s", "--subject", help = "Message Subject", default = os.environ.get('SUBJECT'))
    parser.add_argument("-k", "--key", help = "SendGrid API-KEY", default = os.environ.get('API_KEY'))

    args = parser.parse_args()

    return(args)

def to_sendgrid(args):
# SendGridへAPIにて送信
    message = Mail(
        from_email = args.f,
        to_emails = args.to,
        subject = args.subject,
        plain_text_content = args.message)

    sg = SendGridAPIClient(args.key)
    response = sg.send(message)
    # debug
    #print(response.status_code)
    #print(response.body)
    #print(response.headers)

def main():

    args = get_args()
    to_sendgrid(args)

if __name__ == "__main__":
    main()

使い方

コマンドライン引数で必要パラメータを渡す場合。

./HTTPMail2SendGrid.py -f "hoge@example.com" -t "huga@example.com" -s "TEST MAIL" -k "API_KEY" "This is message."

-hでヘルプ表示

./HTTPMail2SendGrid.py -h
usage: HTTPMail2SendGrid.py [-h] [-f F] [-t TO] [-s SUBJECT] [-k KEY] message

positional arguments:
  message               Mail Message

optional arguments:
  -h, --help            show this help message and exit
  -f F                  Send from Address
  -t TO, --to TO        Send to Address
  -s SUBJECT, --subject SUBJECT
                        Message Subject
  -k KEY, --key KEY     SendGrid API-KEY

パイプ経由でテキストデータを渡す形でも可。
(オプション指定しない場合は環境変数で指定したデフォルト値を使う)

echo hogehoge | ./HTTPMail2SendGrid.py

成果物
HTTPMail2SendGrid

参考

SendGrid
SendGrid v3Mail Python

Discussion