処理 | python 3.6 以上 | python 3.2 以上 3.6 未満 | python 3.2 未満 |
---|---|---|---|
メッセージ作成 | email.message.EmailMessage3.6 で作成 | email.mime.text.MIMEText で作成 (メール送信時に文字列変換) | |
メッセージ内のプレーンテキストの改行:\r・\n は送信時に \r\n に自動変換 | |||
接続 | 接続オブジェクト生成 ホスト名を省略した場合、connect()【接続】で接続 | ||
ログイン等 | 必要に応じてlogin()【ログイン】等実行 | ||
送信先編集 | メール送信で送信先を省略すると、右記処理をメッセージ内容を元に処理 | TO・CC・BCC を全て含んだリストを作成 (メール送信時に指定) メッセージから BCC 情報を削除 | |
HTML テキスト | メッセージのメディアタイプを text/html に設定 | (省略) | |
添付ファイル | メッセージにファイル内容をメディアタイプを指定して追加 境界区切りは自動設定 | (省略) | |
メール送信 | send_message()【メール送信 (Message オブジェクト)】3.2 (内部で sendmail()【メール送信 (メッセージ文字列)】呼び出し) | sendmail()【メール送信 (メッセージ文字列)】 | |
切断 | with 文使用で自動処理3.2 | quit()【セッション終了】を明示的に記述 |
クラス | 備考 |
---|---|
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【ログイン ユーザ名】 |
例外クラス | 備考 |
---|---|
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 ~'
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'
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 ~'
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 ~'
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': ''}
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 ~'
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
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'
SMTP.login(user, password, *, initial_response_ok3.5 =True)
戻り値レスポンスコード(数値)・レスポンスメッセージ(文字列)のタプル
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'
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 ~'
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 ~'
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 ~'
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 ~'
SMTP.starttls(keyfile=None3.6, certfile=None3.6, context=None3.3)
戻り値レスポンスコード(数値)・レスポンスメッセージ(文字列)のタプル
keyfile3.6キーファイル
certfile3.6証明書ファイル
context3.3SSLコンテキスト (SSLContext オブジェクト)
(keyfile と certfile を 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')
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 ~")