メールを送る

Pythonでメールを送るのは、Webページ監視で使ったようなローカルのSMTPサーバで送る方法なら簡単だが、ここではiCloudのようなリモートのSMTPサーバにTLSで接続して送る方法を説明する。

Appleのほかのメールクライアント App 向けの iCloud メールサーバ設定という説明を読んで、まずはApp用パスワードを設定する。ユーザ名は、iCloudのメインの user@icloud.com の形式のメールアドレスである。

メールを組み立てるのは email モジュール、SMTPで送るのは smtplib モジュール、SSL/TLSは ssl モジュールを使う。いずれもPython標準ライブラリに含まれる。特にSSLの Security considerations のBest defaultsを参考にした。

from email.message import EmailMessage
import smtplib
import ssl

# メールを組み立てる
msg = EmailMessage()
msg['From'] = "差出人メアド"
msg['To'] = "宛先メアド"
msg['Subject'] = "件名"
msg.set_content("""本文1行目
本文2行目
""")

# メールを送る
with smtplib.SMTP("smtp.mail.me.com", 587) as smtp:
    context = ssl.create_default_context()
    smtp.starttls(context=context)
    smtp.login("user@icloud.com", "password")
    smtp.send_message(msg)

メールがどのように組み立てられたかは次のようにしてみればわかる。

print(msg.as_string())

smtp.starttls() がうまくいくと (220, b'2.0.0 Ready to start TLS') が返る。さらに smtp.login() がうまくいくと (235, b'2.7.0 Authentication successful') が返る。ユーザ名かパスワードが間違っていると SMTPAuthenticationError: (535, b'5.7.8 Error: authentication failed') が返る。メールを送り終わると (221, b'2.0.0 Bye') が返る。