Python3
からsmptlib
を使ってメール送信を行う。
大分前にDjango
を使った送信を行なったことがあるが、Flask
でもメール送信したい。
Flask
のエクステンションとかあるかもしれないが、python
のモジュール(smtplib
とemail.message
)だけで行うことにした。
なお、gmail
のsmtp
サーバを利用する。
他のメール プラットフォームで Gmail のメールをチェックする - Gmail ヘルプによると、SMTP
の場合、
smtp.gmail.com
SSL を使用する: はい
TLS を使用する: はい(利用可能な場合)
認証を使用する: はい
SSL のポート: 465
TLS / STARTTLS のポート: 587
の設定が必要になるようだ。STARTTLS
を利用するので587
番ポートを指定する。
また、上のgmail
の参考によると、アプリパスワードか安全性の低いアプリを許可するかが必要だ。
(アプリパスワードや許可設定なしでやろうとすると、(534, b'5.7.9 Application-specific password required. Learn more at\n5.7.9 https://support.google.com/mail/?p=InvalidSecondFactor ****** - gsmtp')
というようなエラーが起こる。)
- アプリ パスワードを使用します。2 段階認証プロセスを使用している場合は、アプリ パスワードを使ってログインしてみます。
- 安全性の低いアプリを許可します。2 段階認証プロセスを使用していない場合は、安全性の低いアプリがアカウントにアクセスすることを許可します。
今回はアプリパスワードを利用した。作成については、上の参考ページにある。前者を選択した時は、パスワードにアプリパスワードを指定すればいい。後者を選ぶ時は、パスワードにアカウントのパスワードを指定することになると思う。
ここまで準備したら、email.message
でメッセージを構築して、smtplib
で送れば良い。
EHLO
はSMTP
インスタンスの各メソッドで暗黙的に行われるので、必要ないようだ。(ソースを見ると、starttls()
後に暗黙的にやってくれてるのかよく分からん。self.ehlo_or_helo_if_needed()
がlogin()
やsend_message()など
で行われているので大丈夫。)
手順の大枠は、email: 使用例 — Python 3.8.0 ドキュメントを参考にした。
# Import smtplib for the actual sending function
import smtplib
# Import the email modules we'll need
from email.message import EmailMessage
# Create a text/plain message
msg = EmailMessage()
msg.set_content('this is a test message! hello python mail world!!')
msg['Subject'] = 'The subject!'
msg['From'] = 'from@example.com'
msg['To'] = 'to@example.com'
# Send the message via our own SMTP server.
s = smtplib.SMTP('smtp.gmail.com', 587)
s.starttls()
# 2つ目の引数に生成したアプリパスワードを指定する
s.login('<account_email_address>', '<application_password>')
# 送信
s.send_message(msg)
s.quit()
これを実行すれば、To
のアドレスへ届くはず。
未確認だが、gmailなら、SMTP
クラスでなく、SMTP_SSL
クラスでも行けそう。
SMTP_SSL
ならstarttls()
が不要になる。初めからSSL(TLS)
を使うはずなので。
フローはこんな感じのはず: