📧

【Python】Gmailサーバを使ってメールを送信する

2023/04/17に公開

はじめに

こんにちは。Daddy's Officeの市川です。

今回はGmailサーバーをSMTPサーバーとしてメールを送信するプログラムをPythonで書いてみます。

Gmailサーバーへのログインは、GoogleアカウントでログインというOAuth認証が基本になっていますが、アカウント設定を行うことで、ユーザ/パスワードの認証でログインすることができます。

ただ、この方法が最近変更されたりと、いまいちまとまった情報がなかったので、備忘録として記事に残しておこうと思います。

メール送信の仕組み

メールは、送った人の端末から受信する人の端末へ直接送られているわけではありません。

メールアプリ(Outlookなど)でメールサーバに送信指令を出し、それを受けたメールサーバーが、宛先のメールサーバーにメールを届けます。相手が受信したメールを見る場合は、メールサーバにメールアプリ(Outlookなど)で接続して、送られてきたメールを受信する形です。

メールの送信には、SMTP(Simple Mail Transfer Protocol)というプロトコルが使用されます。ちなみに、このSMTPは、送信者(メール送信プログラム)と送信メールサーバとの間だけでなく、送信メールサーバーと、宛先の受信メールサーバーとの間でも使用されます。

受信者(メール受信プログラム)がメールサーバーからメールを受信するときは、POPまたはIMAPというプロトコルが使用されます。

では、今回はこのSMTPを使用して、メール送信サーバーにGmailサーバを使用するメール送信プログラムを、Pythonを使って作成してみます。

Pythonコード

PythonでGmailをメール送信サーバとして使用してメールを送信するプログラムのサンプルは探すと山のように見つかりますが、現在のGmailサーバーには接続できないものも多くあります。

下記は2023/4現在、Gmailサーバに接続できるサンプルになります。

import smtplib

YOUR_GMAIL_ADDRESS = "xxxxx@gmail.com"
APP_PASSWORD = "xxxxxxxxxxxxxxxx"

if __name__ == '__main__':

    connection = smtplib.SMTP("smtp.gmail.com", 587)
    connection.set_debuglevel(True) # enable debug output
    connection.starttls()
    connection.login(YOUR_GMAIL_ADDRESS, APP_PASSWORD)
    
    connection.sendmail(YOUR_GMAIL_ADDRESS, TO_ADDRESS, "TEST Mail from Python!")
    

ポイントは以下です。

smtplib.SMTPで接続

サーバーと接続後に暗号化を有効にする(TLSに切り替える)STARTTLSを使用する為に、一旦素のSMTPで接続した後に、connection.starttls()でTLSを有効にします。

SMTP over SSL/TLSで接続するには、smtplib.SMPT_SSL("smtp.gmail.com", 465)で、ポート465番に接続してください。
(その場合、connection.starttls()をコールするとエラーになります)

loginのパスワードは、アプリパスワードを使用する

connection.login()で指定するパスワードは、通常のGoogleアカウントパスワードではなく、生成したアプリパスワードを使用します。アプリパスワードの生成方法はこの後説明します。

送信元アドレス(From)はloginのアドレスに置き換えられる

connection.sendmail()で、FROMアドレスを、Gmailアドレスとは別の物を指定してもメールは届きましたが、届いたメールでは、FROMアドレスが、login()で指定したユーザID(Gmailアドレス)に置き換わっていました。恐らくなりすまし防止の対応だと思いますが、、、

アプリパスワードの生成

以前はGoogleアカウント設定で安全性の低いアプリとして設定することでGmailのメールサーバーを外部アプリから利用することができましたが、2022/5/30にこの方法は廃止されました。

安全性の低いアプリとGoogleアカウント

2023/4現在では、アプリパスワードという方法を使用することになります。

アプリパスワードでログインする

この方法で生成したパスワードを、通常のGmailパスワードの代わりに設定することで、GmailサーバーにSMTP接続してメールを送信することが可能になります。

このアプリパスワードを使用する前提として、Googleアカウントのログイン設定で2段階認証が有効になっている必要があります。有効になっていない人は、下記を参考に2段階認証を有効にしてください。

2段階認証プロセスを有効にする

2段階認証を有効にしたら、まず、下記のアプリパスワード画面を開きます。(Googleの認証が必要です)

アプリパスワード画面

アプリ選択で「その他(名前を入力)」を選択して、アプリ名を入力し、生成ボタンを押すと、16文字のアプリパスワードが生成されます。

このパスワードは2度と表示できませんので、間違えないようにメモしておきます。

ここで生成したアプリパスワードを、Gmailサーバーへのログインパスワードとして使用します。

さいごに

最近のGmailやMicrosoft Exchangeなどは、サーバへのログインにSMTP-AUTHも使えなくなってきており、OAuth認証が必要な状況になってきています。

TLSもTLS1.0/1.1は非推奨になり、クラウド事業者含めてTLS1.2以上への移行が必須になってきています。

セキュリティが上がるのは喜ばしいことですが、開発者としてはこうした状況を追いかけていく必要があり、まあ、大変ですね。。。

Discussion