【Python】Gmail × 2段階認証(アプリパスワード)での送信方法
PythonでGmailを送る方法を書いていきます。
Googleさんがセキュリティ強化のため「安全性の低いアプリを許可」することによる外部アプリ・スクリプトからのGoogleアカウント接続を禁止しました。
アカウントを安全に保つため、2022 年 5 月 30 日より、Google は、ユーザー名とパスワードのみで Google アカウントにログインするサードパーティ製のアプリとデバイスについてサポートを終了いたします。
なので、自分のGoogleアカウント設定で、
- 2段階認証を有効化
- 「アプリパスワード」を発行
...をしてから、発行したパスワードをプログラムに組み込む必要があります。
この手順を、順番に具体的に記載していきます。
ちなみに
普段使っているPythonの自動メール送信スクリプトが、「安全性の低いアプリを許可」して使っていたので、2022年6月頭からこんなエラーが出て送れなくなっていました。(ライブラリ"smtplib"を使用)
Traceback (most recent call last):
File "/Users/yuki/Desktop/program/notify.py", line 591, in <module>
send(FROM_ADDRESS, to_addr, msg)
File "/Users/yuki/Desktop/program/notify.py", line 51, in send
smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
File "/usr/local/Cellar/python@3.9/3.9.10/Frameworks/Python.framework/Versions/3.9/lib/python3.9/smtplib.py", line 750, in login
raise last_exception
File "/usr/local/Cellar/python@3.9/3.9.10/Frameworks/Python.framework/Versions/3.9/lib/python3.9/smtplib.py", line 739, in login
(code, resp) = self.auth(
File "/usr/local/Cellar/python@3.9/3.9.10/Frameworks/Python.framework/Versions/3.9/lib/python3.9/smtplib.py", line 662, in auth
raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8 https://support.google.com/mail/?p=BadCredentials f184-20020a636ac1000000b003f24d67d226sm10881883pgc.92 - gsmtp')
同じように「急に送れなくなった」と困っているかたは参考にしてみてください。
ー もくじ ー
【Python】Gmailを2段階認証(アプリパスワード)で送信する手順
以下、3ステップです。
- Googleアカウントのセキュリティ設定で2段階認証を有効化
- アプリパスワードを発行
- アプリパスワードをプログラムへ組み込む
以下手順で貼る画像は、2022年6〜7月頭時点のものです。
月日が経過するにつれ、操作手順などが異なっていく可能性があるので「この記事通りにいかないぞ」となったら適宜Google本家サイトを参照してみてください。
1. Googleアカウントのセキュリティ設定で2段階認証を有効化
Googleアカウントページへアクセスし、
▼セキュリティ > 2段階認証プロセス をクリック。
「使ってみる」をクリックしたあと、
▼続行をクリック。
▼「送信」をクリック。
▼スマホに届いた6ケタのコードを入力して「次へ」。
▼「有効にする」をクリック。
これで2段階認証の有効化が完了です。
2. アプリパスワードを発行
▼「セキュリティ」画面に戻り、「アプリパスワード」をクリック。
▼「アプリを選択」→「その他(名前を入力)」を選択し、適当なテキストを入力(なんでもよい)。
▼表示された16ケタのパスワードをメモしておく。
※この画面を閉じると、このパスワードはもう画面から参照できなくなるようです
3. アプリパスワードをプログラムへ組み込む
以下5〜11行目を適宜書き換えてください。
メモ:
もし、今まで「ログインアカウントと同じパスワード」で動いていたスクリプトがお手元にすでにある場合は、そのパスワードをアプリパスワードに置き換えるだけでOKです。
Pythonimport smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
from_address = 'xxxxxxxxxxxx@gmail.com'
to_address = 'xxxxxxxxxxxx@gmail.com'
bcc = ''
# 発行したアプリパスワード
app_password = 'xxxxxxxxxxxxxx'
subject = 'testタイトルです'
body = 'test内容です'
def create_message(from_addr, to_addr, bcc_addrs, subject, body):
msg = MIMEText(body, 'html')
msg['Subject'] = subject
msg['From'] = from_addr
msg['To'] = to_addr
msg['Bcc'] = bcc_addrs
msg['Date'] = formatdate()
print(type(msg))
return msg
def send(from_addr, to_addrs, msg):
smtpobj = smtplib.SMTP('smtp.gmail.com', 587, timeout=15)
smtpobj.starttls()
smtpobj.login(from_address, app_password)
smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
smtpobj.close()
message = create_message(from_address, to_address, bcc, subject, body)
send(from_address, to_address, message)
スクリプトを実行し、メールが無事に届けば完了です!