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

このページでは、Python の 標準ライブラリ「smtplib、email 」を使ったメールの送信について、簡単にまとめています。mtplib、email とも標準ライブラリのため、インストールは不要です。

今回は、メールの作成には email を使い、メールの送信は smtplib で行います。
最初に「本文のみのメール」の送信について解説し、次に「ファイルを添付したメール」の送信について解説します。

※検証環境は、Windows 10 Pro 64bit 版で行いました。

解説内容

  1. メールの送信内容、SMTPサーバー情報について
  2. 本文のみのメールの送信
  3. ファイルを添付したメールの送信

1. メールの送信内容、SMTPサーバー情報について

今回は、以下のメール内容、サーバー設定で検証を行います。
※省略部分が多いですが、適宜読み替えてください。

送信メールの項目

 送信元メールアドレス:’– 記載省略 –‘
 送信先メールアドレス:’– 記載省略 –‘
 メール件名 :’メール送信テスト’
 メール本文 :’Pythonからのメール送信テストです。’
 添付ファイル:送信確認.pdf

SMTP サーバー情報

 SMTP サーバー:’– 記載省略 –’ # SMTP サーバー名 or IPアドレス
 ポート番号 :’465’    # SMTP サーバのポート番号
 暗号化方式 :SSL/TLS (SMTPS)
 ユーザーID :’– 記載省略 –‘ # SMTPサーバーへのログインユーザーID
 パスワード :’– 記載省略 –’ # SMTPサーバーへのログインパスワード

SMTPサーバーの設定例
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文以外何も出力されていませんが、メール送信が完了しました。

メール送信
メール送信

ファイル添付したメールが正常に受信され、添付ファイルも正常に受信&表示できました。

メール送信結果(添付ファイルあり)
メール送信結果(添付ファイルあり)
添付されたPDFファイル
添付されたPDFファイル

以上で、smtplib、email ライブラリを使ったメールの送信処理は終了です。