20.12。 smtplib —SMTPプロトコルクライアント
ソースコード: :source: `Lib / smtplib.py`
smtplib モジュールは、SMTPまたはESMTPリスナーデーモンを備えた任意のインターネットマシンにメールを送信するために使用できるSMTPクライアントセッションオブジェクトを定義します。 SMTPおよびESMTPの操作の詳細については、 RFC 821 (簡易メール転送プロトコル)および RFC 1869 (SMTPサービス拡張)を参照してください。
- class smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])
SMTP インスタンスは、SMTP接続をカプセル化します。 SMTPおよびESMTP操作の完全なレパートリーをサポートするメソッドがあります。 オプションのホストとポートのパラメーターが指定されている場合、SMTP connect()メソッドは、初期化中にそれらのパラメーターを使用して呼び出されます。 指定した場合、 local_hostname は、HELO / EHLOコマンドのローカルホストのFQDNとして使用されます。 それ以外の場合、ローカルホスト名は socket.getfqdn()を使用して検出されます。 connect()呼び出しが成功コード以外を返す場合、 SMTPConnectError が発生します。 オプションの timeout パラメーターは、接続試行などのブロック操作のタイムアウトを秒単位で指定します(指定されていない場合は、グローバルなデフォルトのタイムアウト設定が使用されます)。 タイムアウトが経過すると、 socket.timeout が発生します。
通常の使用では、初期化/接続、 sendmail()、および SMTP.quit()メソッドのみが必要です。 例を以下に示します。
バージョン2.6で変更: timeout が追加されました。
- class smtplib.SMTP_SSL([host[, port[, local_hostname[, keyfile[, certfile[, timeout]]]]]])
SMTP_SSL インスタンスは、 SMTP のインスタンスとまったく同じように動作します。 SMTP_SSL は、接続の最初からSSLが必要であり、
starttls()
の使用が適切でない場合に使用する必要があります。 host が指定されていない場合、ローカルホストが使用されます。 ポートを省略すると、標準のSMTP-over-SSLポート(465)が使用されます。 local_hostname は、 SMTP クラスの場合と同じ意味です。 keyfile および certfile もオプションであり、SSL接続用のPEM形式の秘密鍵と証明書チェーンファイルを含めることができます。 オプションの timeout パラメーターは、接続試行などのブロック操作のタイムアウトを秒単位で指定します(指定されていない場合は、グローバルなデフォルトのタイムアウト設定が使用されます)。 タイムアウトが経過すると、 socket.timeout が発生します。バージョン2.6の新機能。
- class smtplib.LMTP([host[, port[, local_hostname]]])
ESMTPと非常によく似たLMTPプロトコルは、標準のSMTPクライアントに大きく基づいています。 LMTPにはUnixソケットを使用するのが一般的であるため、
connect()
メソッドは、通常のhost:portサーバーと同様にそれをサポートする必要があります。 local_hostname は、 SMTP クラスの場合と同じ意味です。 Unixソケットを指定するには、 host の絶対パスを「/」で始める必要があります。認証は、通常のSMTPメカニズムを使用してサポートされます。 Unixソケットを使用する場合、LMTPは通常、認証をサポートまたは必要としませんが、マイレージは異なる場合があります。
バージョン2.6の新機能。
例外の適切な選択も定義されています。
- exception smtplib.SMTPException
- このモジュールによって提供される他のすべての例外の基本例外クラス。
- exception smtplib.SMTPServerDisconnected
- この例外は、サーバーが予期せず切断された場合、またはサーバーに接続する前に SMTP インスタンスを使用しようとした場合に発生します。
- exception smtplib.SMTPResponseException
- SMTPエラーコードを含むすべての例外の基本クラス。 これらの例外は、SMTPサーバーがエラーコードを返したときに生成される場合があります。 エラーコードはエラーの
smtp_code
属性に格納され、smtp_error
属性はエラーメッセージに設定されます。
- exception smtplib.SMTPSenderRefused
- 送信者のアドレスは拒否されました。 すべての SMTPResponseException 例外で設定された属性に加えて、これはSMTPサーバーが拒否した文字列に「sender」を設定します。
- exception smtplib.SMTPRecipientsRefused
- すべての受信者アドレスが拒否されました。 各受信者のエラーには、属性
recipients
を介してアクセスできます。これは、 SMTP.sendmail()が返すのとまったく同じ種類の辞書です。
- exception smtplib.SMTPDataError
- SMTPサーバーはメッセージデータの受け入れを拒否しました。
- exception smtplib.SMTPConnectError
- サーバーとの接続の確立中にエラーが発生しました。
- exception smtplib.SMTPHeloError
- サーバーは
HELO
メッセージを拒否しました。
- exception smtplib.SMTPAuthenticationError
- SMTP認証が失敗しました。 おそらく、サーバーは提供されたユーザー名とパスワードの組み合わせを受け入れませんでした。
も参照してください
- RFC 821 -シンプルメール転送プロトコル
- SMTPのプロトコル定義。 このドキュメントでは、SMTPのモデル、操作手順、およびプロトコルの詳細について説明します。
- RFC 1869 -SMTPサービス拡張
- SMTPのESMTP拡張機能の定義。 これは、新しいコマンドでSMTPを拡張し、サーバーによって提供されるコマンドの動的検出をサポートするためのフレームワークについて説明し、いくつかの追加コマンドを定義します。
20.12.1。 SMTPオブジェクト
SMTP インスタンスには次のメソッドがあります。
- SMTP.set_debuglevel(level)
- デバッグ出力レベルを設定します。 level の真の値は、接続およびサーバーとの間で送受信されるすべてのメッセージのデバッグメッセージになります。
- SMTP.docmd(cmd[, argstring])
コマンド cmd をサーバーに送信します。 オプションの引数 argstring は、スペースで区切ってコマンドに連結するだけです。
これは、数値応答コードと実際の応答行で構成される2タプルを返します(複数行の応答は1つの長い行に結合されます)。
通常の操作では、このメソッドを明示的に呼び出す必要はありません。 これは他のメソッドを実装するために使用され、プライベート拡張機能のテストに役立つ場合があります。
応答を待っている間にサーバーへの接続が失われると、 SMTPServerDisconnected が発生します。
- SMTP.connect([host[, port]])
- 特定のポートでホストに接続します。 デフォルトでは、標準のSMTPポート(25)でローカルホストに接続します。 ホスト名がコロン(
':'
)の後に数字が続く場合、そのサフィックスは削除され、その数字は使用するポート番号として解釈されます。 インスタンス化中にホストが指定された場合、このメソッドはコンストラクターによって自動的に呼び出されます。 サーバーが接続応答で送信した応答コードとメッセージの2タプルを返します。
- SMTP.helo([hostname])
HELO
を使用して、SMTPサーバーに対して自分自身を識別します。 hostname引数のデフォルトは、ローカルホストの完全修飾ドメイン名です。 サーバーから返されたメッセージは、オブジェクトのhelo_resp
属性として保存されます。通常の操作では、このメソッドを明示的に呼び出す必要はありません。 必要に応じて、 sendmail()によって暗黙的に呼び出されます。
- SMTP.ehlo([hostname])
EHLO
を使用して、ESMTPサーバーに対して自分自身を識別します。 hostname引数のデフォルトは、ローカルホストの完全修飾ドメイン名です。 ESMTPオプションの応答を調べて、 has_extn()で使用できるように保存します。 また、いくつかの情報属性を設定します。サーバーから返されるメッセージはehlo_resp
属性として保存され、does_esmtp
はサーバーがESMTPをサポートするかどうかに応じてtrueまたはfalseに設定され、 [X207X ]は、このサーバーがサポートするSMTPサービス拡張機能の名前とそのパラメーター(存在する場合)を含む辞書になります。メールを送信する前に has_extn()を使用する場合を除いて、このメソッドを明示的に呼び出す必要はありません。 必要に応じて、 sendmail()によって暗黙的に呼び出されます。
- SMTP.ehlo_or_helo_if_needed()
このセッションで以前に
EHLO
またはHELO
コマンドがなかった場合、このメソッドは ehlo()または helo()を呼び出します。 最初にESMTPEHLO
を試行します。SMTPHeloError
サーバーは
HELO
グリーティングに正しく応答しませんでした。
バージョン2.6の新機能。
- SMTP.has_extn(name)
- name がサーバーから返されるSMTPサービス拡張機能のセットに含まれている場合は、 True を返し、それ以外の場合は False を返します。 大文字と小文字は区別されません。
- SMTP.verify(address)
SMTP
VRFY
を使用して、このサーバーのアドレスの有効性を確認してください。 ユーザーアドレスが有効な場合、コード250と完全な RFC 822 アドレス(人間の名前を含む)で構成されるタプルを返します。 それ以外の場合は、400以上のSMTPエラーコードとエラー文字列を返します。ノート
多くのサイトは、スパマーを阻止するためにSMTP
VRFY
を無効にしています。
- SMTP.login(user, password)
- 認証が必要なSMTPサーバーにログインします。 引数は、認証に使用するユーザー名とパスワードです。 このセッションで以前に
EHLO
またはHELO
コマンドがなかった場合、このメソッドは最初にESMTPEHLO
を試行します。 このメソッドは、認証が成功した場合に正常に返されるか、次の例外が発生する可能性があります。
SMTPHeloError
- サーバーは
HELO
グリーティングに正しく応答しませんでした。 SMTPAuthenticationError
- サーバーはユーザー名とパスワードの組み合わせを受け入れませんでした。
SMTPException
- 適切な認証方法が見つかりませんでした。
- SMTP.starttls([keyfile[, certfile]])
SMTP接続をTLS(トランスポート層セキュリティ)モードにします。 以降のすべてのSMTPコマンドは暗号化されます。 その後、 ehlo()を再度呼び出す必要があります。
keyfile および certfile が指定されている場合、これらは socket モジュールの ssl()関数に渡されます。
このセッションで以前に
EHLO
またはHELO
コマンドがなかった場合、このメソッドは最初にESMTPEHLO
を試行します。バージョン2.6で変更されました。
SMTPHeloError
サーバーは
HELO
グリーティングに正しく応答しませんでした。SMTPException
サーバーはSTARTTLS拡張機能をサポートしていません。
バージョン2.6で変更されました。
RuntimeError
PythonインタープリターではSSL / TLSサポートを利用できません。
- SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])
メールを送信します。 必要な引数は、 RFC 822 from-address文字列、 RFC 822 to-address文字列のリストです(裸の文字列は1つのアドレスを持つリストとして扱われます)、およびメッセージ文字列。 呼び出し元は、
MAIL FROM
コマンドで使用されるESMTPオプション(8bitmime
など)のリストを mail_options として渡すことができます。 すべてのRCPT
コマンドで使用する必要があるESMTPオプション(DSN
コマンドなど)は、 rcpt_options として渡すことができます。 (受信者ごとに異なるESMTPオプションを使用する必要がある場合は、mail()
、rcpt()
、data()
などの低レベルの方法を使用してメッセージを送信する必要があります。)ノート
from_addr および to_addrs パラメーターは、トランスポートエージェントによって使用されるメッセージエンベロープを構築するために使用されます。 SMTP は、メッセージヘッダーを変更しません。
このセッションで以前に
EHLO
またはHELO
コマンドがなかった場合、このメソッドは最初にESMTPEHLO
を試行します。 サーバーがESMTPを実行する場合、メッセージサイズと指定された各オプションがサーバーに渡されます(オプションがサーバーがアドバタイズする機能セットに含まれている場合)。EHLO
が失敗した場合、HELO
が試行され、ESMTPオプションが抑制されます。このメソッドは、メールが少なくとも1人の受信者に受け入れられた場合に正常に返されます。 それ以外の場合は、例外が発生します。 つまり、このメソッドで例外が発生しない場合は、誰かがあなたのメールを受け取る必要があります。 このメソッドで例外が発生しない場合は、拒否された受信者ごとに1つのエントリを持つディクショナリが返されます。 各エントリには、SMTPエラーコードのタプルと、サーバーから送信された付随するエラーメッセージが含まれています。
このメソッドでは、次の例外が発生する可能性があります。
SMTPRecipientsRefused
すべての受信者は拒否されました。 誰もメールを受け取らなかった。 例外オブジェクトの
recipients
属性は、拒否された受信者に関する情報(少なくとも1人の受信者が受け入れられたときに返されるものなど)を含む辞書です。SMTPHeloError
サーバーは
HELO
グリーティングに正しく応答しませんでした。SMTPSenderRefused
サーバーは from_addr を受け入れませんでした。
SMTPDataError
サーバーは、予期しないエラーコード(受信者の拒否以外)で応答しました。
特に明記されていない限り、例外が発生した後でも接続は開かれます。
- SMTP.quit()
SMTPセッションを終了し、接続を閉じます。 SMTP
QUIT
コマンドの結果を返します。バージョン2.6で変更:値を返します。
標準のSMTP / ESMTPコマンドHELP
、RSET
、NOOP
、MAIL
、RCPT
、およびDATA
もサポートされています。 通常、これらを直接呼び出す必要はないため、ここでは説明しません。 詳細については、モジュールコードを参照してください。
20.12.2。 SMTPの例
この例では、メッセージエンベロープに必要なアドレス(「宛先」および「差出人」アドレス)と、配信するメッセージの入力をユーザーに求めます。 メッセージに含まれるヘッダーは、入力されたメッセージに含まれている必要があることに注意してください。 この例では、 RFC 822 ヘッダーの処理は行われません。 特に、「To」および「From」アドレスは、メッセージヘッダーに明示的に含める必要があります。
import smtplib
def prompt(prompt):
return raw_input(prompt).strip()
fromaddr = prompt("From: ")
toaddrs = prompt("To: ").split()
print "Enter message, end with ^D (Unix) or ^Z (Windows):"
# Add the From: and To: headers at the start!
msg = ("From: %s\r\nTo: %s\r\n\r\n"
% (fromaddr, ", ".join(toaddrs)))
while 1:
try:
line = raw_input()
except EOFError:
break
if not line:
break
msg = msg + line
print "Message length is " + repr(len(msg))
server = smtplib.SMTP('localhost')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()