【Python】Gmail × 2段階認証(アプリパスワード)での送信方法

- Python -
2023.09.06
Python[パイソン]

PythonでGmailを送る方法を書いていきます。

Googleさんがセキュリティ強化のため「安全性の低いアプリを許可」することによる外部アプリ・スクリプトからのGoogleアカウント接続を禁止しました。

アカウントを安全に保つため、2022 年 5 月 30 日より、Google は、ユーザー名とパスワードのみで Google アカウントにログインするサードパーティ製のアプリとデバイスについてサポートを終了いたします。

引用:Googleアカウントヘルプ

python gmailの2段階認証(アプリパスワード)

なので、自分のGoogleアカウント設定で、

  1. 2段階認証を有効化
  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ステップです。

  1. Googleアカウントのセキュリティ設定で2段階認証を有効化
  2. アプリパスワードを発行
  3. アプリパスワードをプログラムへ組み込む

以下手順で貼る画像は、2022年6〜7月頭時点のものです。

月日が経過するにつれ、操作手順などが異なっていく可能性があるので「この記事通りにいかないぞ」となったら適宜Google本家サイトを参照してみてください。

参考Googleアカウントヘルプ:2段階認証プロセスを有効にする

1. Googleアカウントのセキュリティ設定で2段階認証を有効化

Googleアカウントページへアクセスし、

▼セキュリティ > 2段階認証プロセス をクリック。

python gmailの2段階認証(アプリパスワード)

「使ってみる」をクリックしたあと、

▼続行をクリック。

python gmailの2段階認証(アプリパスワード)

▼「送信」をクリック。

python gmailの2段階認証(アプリパスワード)

▼スマホに届いた6ケタのコードを入力して「次へ」。

python gmailの2段階認証(アプリパスワード)

▼「有効にする」をクリック。

python gmailの2段階認証(アプリパスワード)

これで2段階認証の有効化が完了です。

2. アプリパスワードを発行

▼「セキュリティ」画面に戻り、「アプリパスワード」をクリック。

python gmailの2段階認証(アプリパスワード)

▼「アプリを選択」→「その他(名前を入力)」を選択し、適当なテキストを入力(なんでもよい)。

python gmailの2段階認証(アプリパスワード)

▼表示された16ケタのパスワードをメモしておく。
※この画面を閉じると、このパスワードはもう画面から参照できなくなるようです

python gmailの2段階認証(アプリパスワード)

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)

スクリプトを実行し、メールが無事に届けば完了です!

↑TOP