Cloud Functions – Python
Python は標準で多種多様なパッケージが用意されています。
しかし Cloud Functions では利用できないものや、機能が制限されているものがあり、しかもバージョンによって利用可能有無が異なっていたりします。例えば、過去には画像系のパッケージが Cloud Functions で利用できなかったため、急遽画像処理用のサーバを用意したこともありました。
今回 Cloud Functions よりメールを送信する必要があったので、動作確認を含めて Python のメール送信パッケージ smtplib を利用してみたので紹介します。
日本語のメールを送信
smtplib は Python で手軽に利用できますが、日本語を送ろうとするとメールタイトルとメール本文に文字コードの設定が必要になります。一般的には UTF-8 を利用すればいいでしょう。下記ではその設定方法も併せて紹介します。
SMTP サーバ ( Gmail )
メールを送信するには SMTP サーバが必要になります。今回は無料で利用できる Gmail を利用したケースをご紹介します。ただそのためには Gmail での設定が必要になります。(安全性の低いアプリを許可する方法もありますが、セキュリティ上オススメできないのでここでは紹介しません。)
- 下記より Google アカウントのセキュリティを開く
https://myaccount.google.com/security
- 2段階認証プロセスをオンにする
2段階認証プロセスをオンにし、ウィザードに従って設定を行ってください
- アプリパスワードを生成する
通常ログインするときのパスワードとは別に、アプリから利用するためのパスワードを生成します。
・アプリを選択: メール
・デバイスを選択: そのほか(名前を入力)
生成されたアプリパスワードが表示されますので、そのパスワードを利用します。
ソースコード
それではソースコードを示します。
from email.header import Header
from email.mime.text import MIMEText
import smtplib
SENDER_EMAIL = 'SENDER@MAIL.ADDRESS'
SENDER_PASSWORD = 'GMAIL_APP_PASSWORD'
SENDER_DOMAIN = 'smtp.gmail.com'
SENDER_PORT = 465
def __send_email():
"""
メール送信
"""
try:
email = 'RECIEVER@MAIL.ADDRESS'
# 送信するメールの内容
subject = '日本語のテストメール'
body = """日本語の本文です。
複数行での文章入力のテスト
最後の行"""
# 送信メッセージの生成
message = MIMEText(body, 'plain', 'utf-8')
message['Subject'] = Header(subject, 'utf-8')
message['From'] = SENDER_EMAIL
message['To'] = email
# メール送信実行
server = smtplib.SMTP_SSL(SENDER_DOMAIN, SENDER_PORT)
server.login(SENDER_EMAIL, SENDER_PASSWORD)
server.sendmail(SENDER_EMAIL, email, message.as_string())
server.close()
except Exception as e:
print(e)
if __name__ == '__main__':
__send_email()
構成は非常にシンプルです。
- 4〜8行目、送信元の情報
- 19〜22行目、送信内容
- 25〜28行目、メッセージ生成
- 31〜34行目、メール送信実行
特筆するとすれば、 6行目のパスワードには Gmail のアプリパスワード(ログインパスワードではない)を用いること、 33行目のメール送信前に 32行目のログイン処理が必要であることです。
同様なソースコードで Cloud Functions でも動作することを確認済みです。
まとめ
今回は、 Cloud Functions でも使える Python のメール送信パッケージ smtplib を紹介しました。 Python は標準でこのように簡単に利用できるパッケージを備えているのが嬉しいですね。業務系システムを開発しているとメールを送信することはよくあるので、大変助かります。ぜひ皆さんもご利用ください。