smtplib【SMTP プロトコルクライアント】

メモ

クラス備考
SMTP【SMTP接続 クラス】
SMTP_SSL【SMTP(SSL)接続 クラス】SMTP【SMTP接続 クラス】を継承
LMTP【LMTP接続 クラス】SMTP【SMTP接続 クラス】を継承
属性備考
does_esmtp【サーバの ESMTP サポート有無】1 (サポート) / 0 (未サポート)
ehlo_resp【EHLO レスポンスメッセージ】
esmtp_features【拡張SMTPサービス】サービス名・パラメータ (辞書型)
helo_resp【HELO レスポンスメッセージ】
password【ログイン パスワード】 login()【ログイン】で設定
auth()【AUTH コマンド送信】で提供認証メカニズムを利用する場合、事前に設定
user【ログイン ユーザ名】
メソッド備考
auth()【AUTH コマンド送信】3.5
connect()【接続】
docmd()【指定コマンド送信】
ehlo()【EHLO コマンド送信】
ehlo_or_helo_if_needed()【EHLO・HELO コマンド送信】
has_extn()【拡張SMTPサービスチェック】
helo()【HELO コマンド送信】
login()【ログイン】3.5 内部で下記呼び出し
ehlo_or_helo_if_needed()【EHLO・HELO コマンド送信】
auth()【AUTH コマンド送信】3.5
quit()【セッション終了】クラスを with 文で使用すると省略可能3.3
send_message()【メール送信 (Message オブジェクト)】 3.23.5 内部で下記呼び出し
ehlo_or_helo_if_needed()【EHLO・HELO コマンド送信】
sendmail()【メール送信 (メッセージ文字列)】
sendmail()【メール送信 (メッセージ文字列)】3.2・3.5 内部で下記呼び出し
ehlo_or_helo_if_needed()【EHLO・HELO コマンド送信】
set_debuglevel()【デバッグ出力レベル設定】3.5
starttls()【TLS 開始】3.3・3.4・3.5・3.6 内部で下記呼び出し
ehlo_or_helo_if_needed()【EHLO・HELO コマンド送信】
verify()【アドレス妥当性チェック】
例外クラス備考
SMTPAuthenticationError【認証失敗例外】
SMTPConnectError【接続エラー例外】
SMTPDataError【メッセージデータエラー例外】
SMTPException【基底例外】全ての例外の基底
SMTPHeloError【HELOエラー例外】
SMTPNotSupportedError【未サポート例外】3.5
SMTPRecipientsRefused【全受取エラー例外】recipients 属性:受取エラーアドレス (辞書型)
SMTPResponseException【エラーコードあり例外】smtp_code 属性:エラーコード
smtp_error 属性:エラーメッセージ
SMTPSenderRefused【送信元アドレスエラー例外】
SMTPServerDisconnected【切断例外】

クラス

メモ

構文

# SMTP【SMTP接続 クラス】
class smtplib.SMTP(host='', port=0, local_hostname=None, [timeout, ]source_address=None3.3)

# SMTP_SSL【SMTP(SSL)接続 クラス】
class smtplib.SMTP_SSL(host='', port=0, local_hostname=None, keyfile=None3.6, certfile=None3.6, [timeout, ]context=None3.3, source_address=None3.3)

# LMTP【LMTP接続 クラス】
class smtplib.LMTP(host='', port=LMTP_PORT, local_hostname=None, source_address=None)

hostホスト名
portポート番号
local_hostnameローカルホスト名
keyfile3.6キーファイル
certfile3.6証明書チェーンファイル
timeoutタイムアウト (秒単位)
contextコンテキスト (SSLContext オブジェクト等)
source_address複数インタフェースの送信元 (ホスト名とポート番号のタプル)

import smtplib

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
    smtp.set_debuglevel(1)
    smtp.docmd("NOOP")
【出力例】
send: 'NOOP\r\n'
reply: b'250 2.0.0 OK ~'
reply: retcode (250); Msg: b'2.0.0 OK ~'
send: 'QUIT\r\n'
reply: b'221 2.0.0 closing connection ~'
reply: retcode (221); Msg: b'2.0.0 closing connection ~'
import smtplib

with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp:
    smtp.set_debuglevel(1)
    smtp.docmd("NOOP")
【出力例】
send: 'NOOP\r\n'
reply: b'250 2.0.0 OK ~'
reply: retcode (250); Msg: b'2.0.0 OK ~'
send: 'QUIT\r\n'
reply: b'221 2.0.0 closing connection ~'
reply: retcode (221); Msg: b'2.0.0 closing connection ~'

auth()【AUTH コマンド送信】3.5

メモ

構文

SMTP.auth(mechanism, authobject, *, initial_response_ok=True)

戻り値レスポンスコード(数値)・レスポンスメッセージ(文字列)のタプル
mechanism認証メカニズム (大小文字の区別なし)
authobject認証処理オブジェクト (オプションの単一引数)
SMTP クラスが提供している認証は下記を参照
initial_response_ok初期応答の送信有無
提供 認証メカニズム認証処理オブジェクト備考
"CRAM-MD5"auth_cram_md5(challenge=None) 事前に下記属性の設定が必要
user【ログイン ユーザ名】
password【ログイン パスワード】
"PLAIN"auth_plain(challenge=None)
"LOGIN"auth_login(challenge=None)

import smtplib

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
    smtp.ehlo()
    smtp.starttls()
    smtp.ehlo()
    smtp.user = "~"
    smtp.password = "~"
    smtp.set_debuglevel(True)
    smtp.auth("PLAIN", smtp.auth_plain)
    smtp.set_debuglevel(False)
【出力例】
send: 'AUTH PLAIN ~'
reply: b'235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: b'2.7.0 Accepted'

connect()【接続】

メモ

構文

SMTP.connect(host='localhost', port=0)

戻り値レスポンスコード(数値)・レスポンスメッセージ(文字列)のタプル
hostホスト名
portポート番号

import smtplib

with smtplib.SMTP() as smtp:
    smtp.set_debuglevel(1)
    smtp.connect("smtp.gmail.com", 587)
    #
    # メール送信
    #
【出力例】
connect: ('smtp.gmail.com', 587)
connect: to ('smtp.gmail.com', 587) None
reply: b'220 smtp.gmail.com ESMTP ~'
reply: retcode (220); Msg: b'smtp.gmail.com ESMTP ~'
connect: b'smtp.gmail.com ESMTP ~'
send: 'QUIT\r\n'
reply: b'221 2.0.0 closing connection ~'
reply: retcode (221); Msg: b'2.0.0 closing connection ~'

docmd()【指定コマンド送信】

メモ

構文

SMTP.docmd(cmd, args='')

戻り値レスポンスコード(数値)・レスポンスメッセージ(文字列)のタプル
cmdコマンド 
argsオプション引数
例外SMTPServerDisconnected【切断例外】

import smtplib

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
    smtp.set_debuglevel(1)
    smtp.docmd("NOOP")
【出力例】
send: 'NOOP\r\n'
reply: b'250 2.0.0 OK ~'
reply: retcode (250); Msg: b'2.0.0 OK ~'
send: 'QUIT\r\n'
reply: b'221 2.0.0 closing connection ~'
reply: retcode (221); Msg: b'2.0.0 closing connection ~'

ehlo()【EHLO コマンド送信】

メモ

構文

SMTP.ehlo(name='')

戻り値レスポンスコード(数値)・レスポンスメッセージ(文字列)のタプル
nameホスト名

import smtplib

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
    smtp.ehlo()
    print("[does_esmtp]")
    print(smtp.does_esmtp)
    print("[ehlo_resp]")
    print(smtp.ehlo_resp)
    print("[esmtp_features]")
    print(smtp.esmtp_features)
【出力例】
[does_esmtp]
1
[ehlo_resp]
b'smtp.gmail.com at your service, [~]\nSIZE 35882577\n8BITMIME\nSTARTTLS\nENHANCEDSTATUSCODES\nPIPELINING\nCHUNKING\nSMTPUTF8'
[esmtp_features]
{'size': '35882577', '8bitmime': '', 'starttls': '', 'enhancedstatuscodes': '', 'pipelining': '', 'chunking': '', 'smtputf8': ''}

ehlo_or_helo_if_needed()【EHLO・HELO コマンド送信】

メモ

構文

SMTP.ehlo_or_helo_if_needed()

戻り値なし
例外SMTPHeloError【HELOエラー例外】

import smtplib

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
    smtp.set_debuglevel(1)
    smtp.ehlo_or_helo_if_needed()
【出力例】
send: 'ehlo [~]\r\n'
reply: b'250-smtp.gmail.com at your service, [~]\r\n'
reply: b'250-SIZE 35882577\r\n'
reply: b'250-8BITMIME\r\n'
reply: b'250-STARTTLS\r\n'
reply: b'250-ENHANCEDSTATUSCODES\r\n'
reply: b'250-PIPELINING\r\n'
reply: b'250-CHUNKING\r\n'
reply: b'250 SMTPUTF8\r\n'
reply: retcode (250); Msg: b'smtp.gmail.com at your service, [~]\nSIZE 35882577\n8BITMIME\nSTARTTLS\nENHANCEDSTATUSCODES\nPIPELINING\nCHUNKING\nSMTPUTF8'
send: 'QUIT\r\n'
reply: b'221 2.0.0 closing connection ~'
reply: retcode (221); Msg: b'2.0.0 closing connection ~'

has_extn()【拡張SMTPサービスチェック】

メモ

構文

SMTP.has_extn(name)

戻り値サポート有無 (True / False)
nameサービス名 (大小文字の区別なし)

import smtplib

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
    smtp.ehlo()
    print("[esmtp_features]")
    print(smtp.esmtp_features)
    print(smtp.has_extn("STARTTLS"))
    print(smtp.has_extn("SMTPUTF8"))
    print(smtp.has_extn("TEST"))
【出力例】
[esmtp_features]
{'size': '35882577', '8bitmime': '', 'starttls': '', 'enhancedstatuscodes': '', 'pipelining': '', 'chunking': '', 'smtputf8': ''}
True
True
False

helo()【HELO コマンド送信】

メモ

構文

SMTP.helo(name='')

戻り値レスポンスコード(数値)・レスポンスメッセージ(文字列)のタプル
nameホスト名

import smtplib

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
    smtp.helo()
    print("[helo_resp]")
    print(smtp.helo_resp)
【出力例】
[helo_resp]
b'smtp.gmail.com at your service'

login()【ログイン】3.5

メモ

構文

SMTP.login(user, password, *, initial_response_ok=True3.5)

戻り値レスポンスコード(数値)・レスポンスメッセージ(文字列)のタプル
userユーザ名
passwordパスワード
initial_response_ok3.5初期応答の送信有無 (auth()【AUTH コマンド送信】3.5 に引継ぎ)
例外
SMTPHeloError【HELOエラー例外】
SMTPAuthenticationError【認証失敗例外】ユーザ名・パスワード認証失敗
SMTPNotSupportedError【未サポート例外】3.5AUTH コマンド未サポート
SMTPException【基底例外】適当な認証方法なし

import smtplib

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
    smtp.ehlo()
    smtp.starttls()
    smtp.ehlo()
    smtp.set_debuglevel(True)
    smtp.login("【ユーザ名】", "【パスワード】")
    smtp.set_debuglevel(False)
【出力例】
send: 'AUTH PLAIN ~'
reply: b'235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: b'2.7.0 Accepted'

quit()【セッション終了】

メモ

  • セッション終了
    • クラスを with 文で使用すると省略可能3.3
  • 関連

構文

SMTP.quit()

戻り値レスポンスコード(数値)・レスポンスメッセージ(文字列)のタプル

import smtplib

smtp = smtplib.SMTP("smtp.gmail.com", 587)
smtp.set_debuglevel(1)
#
# メール送信
#
smtp.quit()
【出力例】
send: 'quit\r\n'
reply: b'221 2.0.0 closing connection ~'
reply: retcode (221); Msg: b'2.0.0 closing connection ~'

send_message()【メール送信 (Message オブジェクト)】3.23.5

メモ

構文

SMTP.send_message(msg, from_addr=None, to_addrs=None, mail_options=(), rcpt_options=())

戻り値拒否されたアドレスの辞書 (全て受信:空の辞書)
キー拒否アドレス
レスポンスコード(数値)・レスポンスメッセージ(文字列)のタプル
msgメッセージ (email.message.Messageオブジェクト)
from_addr送信元アドレス (省略:メッセージ内容から設定)
to_addrs送信先アドレス・送信先アドレスのリスト (省略:メッセージ内容から設定)
mail_optionsMAIL FROM コマンドの ESMTPオプションリスト (例:8bitmime)
rcpt_optionsRCPT コマンドの ESMTPオプションリスト (例:DSN)
例外
SMTPRecipientsRefused【全受取エラー例外】全ての受信の拒否 (recipients 属性:戻り値と同様の形式)
SMTPHeloError【HELOエラー例外】HELO コマンドエラー
SMTPSenderRefused【送信元アドレスエラー例外】送信元アドレス不正
SMTPDataError【メッセージデータエラー例外】予期しないエラー (受信拒否以外)
SMTPNotSupported【未サポート例外】3.5サーバが SMTPUTF8 未対応でアドレスに非ASCII文字を含む

import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg['Subject'] = "件名"
msg['From'] = "【送信元アドレス】"
msg['To'] = "【送信先アドレス】"
msg.set_content("本文")
with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
    smtp.ehlo()
    smtp.starttls()
    smtp.ehlo()
    smtp.login("【ユーザ名】", "【パスワード】")
    smtp.set_debuglevel(1)
    smtp.send_message(msg)
【出力例】
send: 'mail FROM:<~> size=192\r\n'
reply: b'250 2.1.0 OK ~'
reply: retcode (250); Msg: b'2.1.0 OK ~'
send: 'rcpt TO:<~>\r\n'
reply: b'250 2.1.5 OK ~'
reply: retcode (250); Msg: b'2.1.5 OK ~'
send: 'data\r\n'
reply: b'354  Go ahead ~'
reply: retcode (354); Msg: b'Go ahead ~'
data: (354, b'Go ahead ~')
send: b'Subject: ~'
reply: b'250 2.0.0 OK  ~'
reply: retcode (250); Msg: b'2.0.0 OK  ~'
data: (250, b'2.0.0 OK  ~')
send: 'QUIT\r\n'
reply: b'221 2.0.0 closing connection ~'
reply: retcode (221); Msg: b'2.0.0 closing connection ~'

sendmail()【メール送信 (メッセージ文字列)】3.2・3.5

メモ

構文

SMTP.sendmail(from_addr, to_addrs, msg, mail_options=(), rcpt_options=())

戻り値拒否されたアドレスの辞書 (全て受信:空の辞書)
キー拒否アドレス
レスポンスコード(数値)・レスポンスメッセージ(文字列)のタプル
from_addr送信元アドレス
to_addrs送信先アドレス (複数:TO・CC・BCC 全てのアドレスを含んだリスト)
(メッセージから BCC 情報の削除が必要)
msgメッセージ (文字列・バイト文字列3.2)
mail_optionsMAIL FROM コマンドの ESMTPオプションリスト (例:8bitmime)
rcpt_optionsRCPT コマンドの ESMTPオプションリスト (例:DSN)
例外
SMTPRecipientsRefused【全受取エラー例外】全ての受信の拒否 (recipients 属性:戻り値と同様の形式)
SMTPHeloError【HELOエラー例外】HELO コマンドエラー
SMTPSenderRefused【送信元アドレスエラー例外】送信元アドレス不正
SMTPDataError【メッセージデータエラー例外】予期しないエラー (受信拒否以外)
SMTPNotSupportedError【未サポート例外】3.5mail_optionsに SMTPUTF8 が指定されているが、サーバが未対応

import smtplib
from email.mime.text import MIMEText

msg = MIMEText("本文")
msg['Subject'] = "件名"
msg['From'] = "【送信元アドレス】"
msg['To'] = "【送信先アドレス】"
smtp = smtplib.SMTP("smtp.gmail.com", 587)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.login("【ユーザ名】", "【パスワード】")
smtp.set_debuglevel(1)
smtp.sendmail("【送信元アドレス】", "【送信先アドレス】", msg.as_string())
smtp.quit()
【出力例】
send: 'mail FROM:<~> size=196\r\n'
reply: b'250 2.1.0 OK ~'
reply: retcode (250); Msg: b'2.1.0 OK ~'
send: 'rcpt TO:<~>\r\n'
reply: b'250 2.1.5 OK ~'
reply: retcode (250); Msg: b'2.1.5 OK ~'
send: 'data\r\n'
reply: b'354  Go ahead ~'
reply: retcode (354); Msg: b'Go ahead ~'
data: (354, b'Go ahead ~')
send: b'Content-Type: text/plain; ~'
reply: b'250 2.0.0 OK  ~'
reply: retcode (250); Msg: b'2.0.0 OK  ~'
data: (250, b'2.0.0 OK  ~')
send: 'quit\r\n'
reply: b'221 2.0.0 closing connection ~'
reply: retcode (221); Msg: b'2.0.0 closing connection ~'

set_debuglevel()【デバッグ出力レベル設定】3.5

メモ

構文

SMTP.set_debuglevel(level)

戻り値なし
levelデバッグ出力レベル (下記参照)
デバッグ出力レベル備考
False
0
出力なし
True
1
出力あり
23.5出力あり (タイムスタンプ付)

import smtplib

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
    smtp.set_debuglevel(1)
    smtp.ehlo()
【出力例】
send: 'ehlo [~]\r\n'
reply: b'250-smtp.gmail.com at your service, ~'
reply: b'250-SIZE 35882577\r\n'
reply: b'250-8BITMIME\r\n'
reply: b'250-STARTTLS\r\n'
reply: b'250-ENHANCEDSTATUSCODES\r\n'
reply: b'250-PIPELINING\r\n'
reply: b'250-CHUNKING\r\n'
reply: b'250 SMTPUTF8\r\n'
reply: retcode (250); Msg: b'smtp.gmail.com at your service, [~]\nSIZE 35882577\n8BITMIME\nSTARTTLS\nENHANCEDSTATUSCODES\nPIPELINING\nCHUNKING\nSMTPUTF8'
send: 'QUIT\r\n'
reply: b'221 2.0.0 closing connection ~'
reply: retcode (221); Msg: b'2.0.0 closing connection ~'

starttls()【TLS 開始】3.3・3.4・3.5・3.6

メモ

構文

SMTP.starttls(keyfile=None3.6, certfile=None3.6, context=None3.3)

戻り値レスポンスコード(数値)・レスポンスメッセージ(文字列)のタプル
keyfile3.6キーファイル
certfile3.6証明書ファイル
context3.3SSLコンテキスト (SSLContext オブジェクト)
(keyfilecertfile を None に指定)
例外
SMTPHeloError【HELOエラー例外】HELO コマンドエラー
SMTPNotSupportedError【未サポート例外】3.5サーバが STARTTLS 拡張に未対応
RuntimeError【ランタイムエラー例外】この Python インタプリタで SSL/TLS 未サポート

import smtplib

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
    smtp.ehlo()
    print(smtp.starttls())
【出力例】
(220, b'2.0.0 Ready to start TLS')

verify()【アドレス妥当性チェック】

メモ

  • アドレス妥当性チェック
    • VRFY コマンドでチェック
    • 不正防止の為、一般的に未サポート
  • 関連

構文

SMTP.verify(address)

戻り値チェック結果
OK250(正常)・フルアドレス(RFC 822)のタプル
NGエラーコード(400以上)・エラーメッセージのタプル
addressアドレス

import smtplib

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
    print(smtp.verify("abc.def@ghi.com"))
【出力例】
(252, b"2.1.5 Send some mail, I'll try my best ~")