本記事の内容
- インターネット接続にプロキシサーバ利用が必須な環境において、Gmailからメールを送れるPythonアプリを実装します。メールプロトコルはSMTPです。
Gmailのsmtpサーバを用いて、Pythonからメールを送りたかったのですが、
インターネット接続のためにプロキシサーバを経由させる必要がでたので、対応方法を調査してまとめました。
例えば、企業内の内部ネットワークやクラウドにおける内部ネットワークからのメール送信等、インターネット接続にプロキシサーバ利用が必要となるプライベートなネットワーク環境でPythonアプリを動かすことを想定しています。
きっと状況としては、よくあるはず。何かの役に立てば幸いです。
実施環境
- Windows 10
- Visual Studio Code
- Python 3.8
手順の流れ
- Googleアカウントでのアプリ認証用のパスワード発行
- SMTPでプロキシ設定できるPythonライブラリのインストール
- Pythonプログラムの作成と実行
1. Googleアカウントでのアプリ認証用のパスワード発行
Googleアカウント管理画面に移動します。(Googleアカウントを未発行でしたら発行してください。)
左のメニューからセキュリティ
をクリックする。
下の方へスクロールし、アプリパスワード
をクリックする。
Googleアカウントのパスワードを入力し、次へ
をクリックする。
アプリを選択
をクリックする。
その他(名前を入力)
をクリックする。
生成されたアプリパスワードをメモする。これは後ほどPythonアプリ内で使います。
2.SMTPでプロキシ設定できるPythonライブラリのインストール
私の場合Visual Studio Codeで開発していたので、Visual Studio Codeのターミナルを起動して、以下のコマンドでPySocksライブラリーをインストールしました。
pip install PySocks
3. Pythonプログラムの作成と実行
以下にサンプルプログラムを載せます。
from email import message
import smtplib
import ssl
import socks
SMTP_HOSTS = 'smtp.gmail.com'
SMTP_PORT = 465
FROM_EMAIL_ADDRESS = 'XXXXXXXX@gmail.com' #自身のgmailアドレスを記載する
PASSWORD = 'XXXXXXXXXX' #手順1で生成したアプリパスワードを記載する
PROXY_HOST = 'YYYYYYYYYYYYYYYYY' #Proxyサーバのドメイン abc.def.comの様な形式
PROXY_PORT = ZZZZZZZ #Proxyサーバのポート番号
TO_EMAIL_ADDRESS = 'AAAAA@BBBB' #送信先のメールアドレス
MAIL_SUBJECT = 'Test E-Mail' #メールタイトルを記載する
BODY_MESSAGE = 'Hello! This is Test Message.' #メール本文を記載する
def make_message(mail_subject, from_address, to_address, body_message):
msg = message.EmailMessage()
msg.set_content(body_message)
msg['Subject'] = mail_subject
msg['From'] = from_address
msg['To'] = to_address
return msg
def set_smtp_client_with_proxy(proxy_host, proxy_port, smtp_host, smtp_port):
socks.setdefaultproxy(socks.HTTP, proxy_host, proxy_port)
socks.wrapmodule(smtplib)
context = ssl.create_default_context()
smtp_client = smtplib.SMTP_SSL(smtp_host, smtp_port, timeout=10, context=context)
return smtp_client
if __name__ == '__main__':
msg = make_message(MAIL_SUBJECT, FROM_EMAIL_ADDRESS, TO_EMAIL_ADDRESS, BODY_MESSAGE)
smtp = set_smtp_client_with_proxy(PROXY_HOST, PROXY_PORT, SMTP_HOSTS, SMTP_PORT)
print('smtp login attempt')
smtp.login(FROM_EMAIL_ADDRESS, PASSWORD)
print('smtp login success')
print('smtp message send attempt')
smtp.send_message(msg)
print('smtp message send success')
smtp.quit()
Visual Studio Codeのターミナルで以下の様に実施する。
PS D:\01_Python> python .\smtp_send.py
smtp login attempt
smtp login success
smtp message send attempt
smtp message send success
PS D:\01_Python>
以下がメールが届いた様子です。
今回のテストでは自身のメールアドレスから、自身宛てにテストメールを送るコードで実行しています。
手順は以上。
参考文献
本記事の作成に当たり、以下の情報を参考にさせて頂きました。