Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

SendGridでTo毎にメールを送る(SMTP API) をPythonで書いた

SendGridのWebAPIではto_emailsというパラメータがあるが、これはToを複数追加するだけで、メールがTo単位で1件ずつ送信されるわけではない。

To毎にメールをバラして送信したい場合は、smtpapiを利用するようだ。Web API経由では出来なかった。

smtpapiを入れる

github.com

このライブラリはSendGridのメールサーバに送るためのヘッダー文字列を作るだけのライブラリ。

実際にメールを送る時は、PythonSMTPメール送信をするのにおなじみsmtplibを使う。

サンプルコード

    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 )
    # HEADER
    from smtpapi import SMTPAPIHeader
    header = SMTPAPIHeader()
    header.set_tos(to)

    # メール本文
    message = MIMEText(content, 'html')
    message['From'] = _from
    message['To'] = ",".join(to)
    message['Subject'] = subject
    message['X-SMTPAPI'] = header.json_string()
    # メール送信
    server.sendmail(_from,
       to, 
       message.as_string().encode('utf-8')
    )
    server.quit()
  • HTMLメールの場合は、MIMETextの第2引数にhtmlを入れ、message.as_string().encode('utf-8')にあるように文字列をUTF8なりでエンコードする。この指定がないとasciiエンコードするため。
  • message['To']は文字列である必要があるので、リストをカンマ区切りの文字列に変換する。
  • message['X-SMTPAPI']にSendGridに送るための情報をセットする