Python の smtplib、email ライブラリを使ったメールの送信

このページでは、Python の 標準ライブラリ「smtplib、email 」を使ったメールの送信について、簡単にまとめています。mtplib、email とも標準ライブラリのため、インストールは不要です。
今回は、メールの作成には email を使い、メールの送信は smtplib で行います。
最初に「本文のみのメール」の送信について解説し、次に「ファイルを添付したメール」の送信について解説します。
※検証環境は、Windows 10 Pro 64bit 版で行いました。
解説内容
1. メールの送信内容、SMTPサーバー情報について
今回は、以下のメール内容、サーバー設定で検証を行います。
※省略部分が多いですが、適宜読み替えてください。
送信メールの項目
送信元メールアドレス:’– 記載省略 –‘
送信先メールアドレス:’– 記載省略 –‘
メール件名 :’メール送信テスト’
メール本文 :’Pythonからのメール送信テストです。’
添付ファイル:送信確認.pdf
SMTP サーバー情報
SMTP サーバー:’– 記載省略 –’ # SMTP サーバー名 or IPアドレス
ポート番号 :’465’ # SMTP サーバのポート番号
暗号化方式 :SSL/TLS (SMTPS)
ユーザーID :’– 記載省略 –‘ # SMTPサーバーへのログインユーザーID
パスワード :’– 記載省略 –’ # SMTPサーバーへのログインパスワード
※Gmailの場合は、アカウントのパスワードでなく「アプリパスワード」というものを新たに取得する必要があるようなので、別途入手しておいてください。
2. 本文のみのメールの送信
先ほどの「送信メールの項目」の内容で、本文のみのメールの送信を行います。
最初に email モジュールでメールを作成し、その後、smtplib モジュールでメールの送信を行います。
以下がメール送信用のプログラムになります。
# 標準ライブラリ smtplib、email を使ったメール送信
# 添付ファイルなし版
from email.mime.text import MIMEText
import smtplib
import ssl
# ===== 送信メールの作成 ===================================
# メール本文
msg = MIMEText('Pythonからのメール送信テストです。')
# 送信元メールアドレス
msg['From'] = '<<送信元メールアドレスを入力>>'
# 送信先メールアドレス
msg['To'] = '<<送信先メールアドレスを入力>>'
# 件名
msg['Subject'] = 'メール送信テスト'
# ========================================================
print('----- メール送信開始 -----')
# SMTP サーバーへ SSL/TLS (SMTPS) 接続
smtpserv = smtplib.SMTP_SSL('<<SMTP サーバーを入力>>', 465, context=ssl.create_default_context())
smtpserv.login('<<SMTP サーバーのユーザーIDを入力>>', '<<パスワードを入力>>')
# メール送信
smtpserv.send_message(msg)
# サーバーから切断
smtpserv.quit()
print('----- メール送信完了 -----')
インポート項目について
最初に、以下の3つの項目をインポートします。
プレーンテキストのメールの送信の場合、email モジュールの「MIMEText」をインポートします。
SMTPの送信は smtpplib モジュール、SSL の暗号化で ssl モジュールを使用します。
from email.mime.text import MIMEText
import smtplib
import ssl
送信メールの作成
本文のみのメールの場合は、MIMEText クラスを使用します。コンストラクタに「メール本文」を渡して メッセージ msg を作成します。
その後、作成したメッセージ msg に、送信元、送信先のメールアドレス、件名をセットしています。
送信メールの作成はこれで完了です。
# ===== 送信メールの作成 ===================================
# メール本文
msg = MIMEText('Pythonからのメール送信テストです。')
# 送信元メールアドレス
msg['From'] = '<<送信元メールアドレスを入力>>'
# 送信先メールアドレス
msg['To'] = '<<送信先メールアドレスを入力>>'
# 件名
msg['Subject'] = 'メール送信テスト'
# ========================================================
SMTP サーバー接続とメールの送信
SMTP サーバーへ接続するため、smtplib.SMTP_SSLクラスのコンストラクタに「SMTP サーバー、ポート番号、SSLコンテキスト」を渡し、オブジェクト smtpserv を作成します。
今回は、SSLコンテキストに「context=ssl.create_default_context())」を指定して、デフォルトの設定で作成しています。
※SSL コンテキストは、SSLの接続に必要な情報(暗号、プロトコルバージョン等)がセットされるようです。
更に smtpserv.login() を呼び、SMTP サーバーへ接続します。
※ここで接続エラーが発生する場合は、サーバー設定等を見直してください。
サーバー接続後、smtpserv.send_message() の引数にメッセージ msg を渡して、メールを送信します。
最後に smtpserv.quit() でサーバーから切断して、メール送信処理を終了します。
# SMTP サーバーへ SSL/TLS (SMTPS) 接続
smtpserv = smtplib.SMTP_SSL('<<SMTP サーバーを入力>>', 465, context=ssl.create_default_context())
smtpserv.login('<<SMTP サーバーのユーザーIDを入力>>', '<<パスワードを入力>>')
# メール送信
smtpserv.send_message(msg)
# サーバーから切断
smtpserv.quit()
結果確認
プログラムの実行結果になります。
print文以外何も出力されていませんが、メール送信が完了しました。
送信したメールが正常に受信できました。

3. ファイルを添付したメールの送信
先ほどの「送信メールの項目」の内容に加えて、ファイルを添付したメールの送信を行います。
ファイルの添付を行う場合は、MIMEMultipart クラスも使用します。
以下がメール送信用のプログラムになります。
# 標準ライブラリ smtplib、email を使ったメール送信
# 添付ファイルあり版
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart # 追加
from email.mime.application import MIMEApplication # 追加
import smtplib
import ssl
# ===== 送信メールを作成 ===================================
# 添付ファイル用
msg = MIMEMultipart() # 変更
# 送信元メールアドレス
msg['From'] = '<<送信元メールアドレスを入力>>'
# 送信先メールアドレス
msg['To'] = '<<送信先メールアドレスを入力>>'
# 件名
msg['Subject'] = 'メール送信テスト'
# メール本文
msg.attach(MIMEText('Pythonからのメール送信テストです。')) # 変更
# ==========================================================
# ===== 添付ファイルの読込みと添付 ============================
with open('送信確認.pdf', 'rb') as f:
attachment = MIMEApplication(f.read())
attachment.add_header('Content-Disposition', 'attachment', filename='送信確認.pdf')
msg.attach(attachment)
# ==========================================================
print('----- メール送信開始 -----')
# SMTP サーバーへ SSL/TLS (SMTPS) 接続
smtpserv = smtplib.SMTP_SSL('<<SMTP サーバーを入力>>', 465, context=ssl.create_default_context())
smtpserv.login('<<SMTP サーバーのユーザーIDを入力>>', '<<パスワードを入力>>')
# メール送信
smtpserv.send_message(msg)
# サーバーから切断
smtpserv.quit()
print('----- メール送信完了 -----')
インポート項目について
新たに、ファイル添付用に MIMEMultipart、MIMEApplication を追加しています。
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart # 追加
from email.mime.application import MIMEApplication # 追加
import smtplib
import ssl
送信メールの作成
ファイルを添付する場合は、MIMEMultipart クラスでメッセージ msg を作成します。
他の項目は、「本文のみ」のメールと同様なのですが、最後に atatch() メソッドで「メール本文」を追加しています。
送信メールの作成はこれで完了です。
# ===== 送信メールの作成 ===================================
# 添付ファイル用
msg = MIMEMultipart() # 変更
# 送信元メールアドレス
msg['From'] = '<<送信元メールアドレスを入力>>'
# 送信先メールアドレス
msg['To'] = '<<送信先メールアドレスを入力>>'
# 件名
msg['Subject'] = 'メール送信テスト'
# メール本文
msg.attach(MIMEText('Pythonからのメール送信テストです。')) # 変更
# ========================================================
添付ファイルの読込みと添付
ファイルを添付する場合は open() 関数 でファイルを開いて、MIMEApplication クラスで読み込みを行い、attachement オブジェクトを作成します。
更に add_header() メソッドで添付ファイルのヘッダー情報を追加します。
最後にメッセージの atatch() メソッドで、メールにファイルを添付します。
送信メールの作成はこれで完了です。
# ===== 添付ファイルの読込みと添付 =========================
with open('送信確認.pdf', 'rb') as f:
attachment = MIMEApplication(f.read())
attachment.add_header('Content-Disposition', 'attachment', filename='送信確認.pdf')
msg.attach(attachment)
# ==========================================================
メールの送信
メールの送信は、「本文のみのメールの送信」と同様の処理のため省略します。
結果確認
プログラムの実行結果になります。
print文以外何も出力されていませんが、メール送信が完了しました。
ファイル添付したメールが正常に受信され、添付ファイルも正常に受信&表示できました。
以上で、smtplib、email ライブラリを使ったメールの送信処理は終了です。