LoginSignup
0
0

More than 1 year has passed since last update.

インターネット接続にプロキシサーバ必須な環境にて、PythonのSMTPクライアントでGmailからメールを送る方法

Last updated at Posted at 2021-11-23

本記事の内容

  • インターネット接続にプロキシサーバ利用が必須な環境において、Gmailからメールを送れるPythonアプリを実装します。メールプロトコルはSMTPです。

Gmailのsmtpサーバを用いて、Pythonからメールを送りたかったのですが、
インターネット接続のためにプロキシサーバを経由させる必要がでたので、対応方法を調査してまとめました。

例えば、企業内の内部ネットワークやクラウドにおける内部ネットワークからのメール送信等、インターネット接続にプロキシサーバ利用が必要となるプライベートなネットワーク環境でPythonアプリを動かすことを想定しています。
きっと状況としては、よくあるはず。何かの役に立てば幸いです。

実施環境

  • Windows 10
  • Visual Studio Code
  • Python 3.8

手順の流れ

  1. Googleアカウントでのアプリ認証用のパスワード発行
  2. SMTPでプロキシ設定できるPythonライブラリのインストール
  3. Pythonプログラムの作成と実行

1. Googleアカウントでのアプリ認証用のパスワード発行

Googleアカウント管理画面に移動します。(Googleアカウントを未発行でしたら発行してください。)

1.png

左のメニューからセキュリティをクリックする。

2.png

下の方へスクロールし、アプリパスワードをクリックする。

3.png

4.png

Googleアカウントのパスワードを入力し、次へをクリックする。

5.png

アプリを選択をクリックする。

6.png

その他(名前を入力)をクリックする。

7.png

デバイス名を入力し、生成をクリックする。
8.png
9.png

生成されたアプリパスワードをメモする。これは後ほどPythonアプリ内で使います。

2.SMTPでプロキシ設定できるPythonライブラリのインストール

私の場合Visual Studio Codeで開発していたので、Visual Studio Codeのターミナルを起動して、以下のコマンドでPySocksライブラリーをインストールしました。

pip install PySocks

3. Pythonプログラムの作成と実行

以下にサンプルプログラムを載せます。

smtp_send.py
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>

以下がメールが届いた様子です。

10.png

今回のテストでは自身のメールアドレスから、自身宛てにテストメールを送るコードで実行しています。

手順は以上。

参考文献

本記事の作成に当たり、以下の情報を参考にさせて頂きました。
- 【2020年度版】PythonでGmailの自動送信を実装する方法を詳しく解説
- Proxy経由でSMTPアクセス

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0