smtpd —SMTPサーバー
ソースコード: :source: `Lib / smtpd.py`
このモジュールは、SMTP(電子メール)サーバーを実装するためのいくつかのクラスを提供します。
も参照してください
aiosmtpd パッケージは、このモジュールの推奨される代替品です。 asyncio に基づいており、より簡単なAPIを提供します。 smtpd は非推奨と見なす必要があります。
いくつかのサーバー実装が存在します。 1つは一般的な何もしない実装であり、オーバーライドできますが、他の2つは特定のメール送信戦略を提供します。
さらに、SMTPChannelを拡張して、SMTPクライアントとの非常に特殊な対話動作を実装することもできます。
このコードは、 RFC 5321 に加えて、 RFC 1870 SIZEおよび RFC 6531 をサポートします。 SMTPUTF8拡張。
SMTPServerオブジェクト
- class smtpd.SMTPServer(localaddr, remoteaddr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False)
ローカルアドレス localaddr にバインドする新しい SMTPServer オブジェクトを作成します。 remoteaddr をアップストリームSMTPリレーとして扱います。 localaddr と remoteaddr はどちらも、(ホスト、ポート)タプルである必要があります。 オブジェクトは asyncore.dispatcher を継承しているため、インスタンス化時に asyncore のイベントループに挿入されます。
data_size_limit は、
DATA
コマンドで受け入れられる最大バイト数を指定します。None
または0
の値は、制限がないことを意味します。map は、接続に使用するソケットマップです(最初は空の辞書が適切な値です)。 指定しない場合、 asyncore グローバルソケットマップが使用されます。
enable_SMTPUTF8 は、
SMTPUTF8
拡張機能( RFC 6531 で定義)を有効にするかどうかを決定します。 デフォルトはFalse
です。True
の場合、SMTPUTF8
はMAIL
コマンドのパラメーターとして受け入れられ、存在する場合はkwargs['mail_options']
の process_message()に渡されます。 ]リスト。 decode_data と enable_SMTPUTF8 を同時にTrue
に設定することはできません。decode_data は、SMTPトランザクションのデータ部分をUTF-8を使用してデコードするかどうかを指定します。 decode_data が
False
(デフォルト)の場合、サーバーは8BITMIME
拡張子( RFC 6152 )をアドバタイズし、BODY=8BITMIME
パラメータをMAIL
コマンドに渡し、存在する場合はkwargs['mail_options']
リストの process_message()に渡します。 decode_data と enable_SMTPUTF8 を同時にTrue
に設定することはできません。- process_message(peer, mailfrom, rcpttos, data, **kwargs)
NotImplementedError 例外を発生させます。 サブクラスでこれをオーバーライドして、このメッセージで役立つことを実行します。 remoteaddr としてコンストラクターに渡されたものはすべて、
_remoteaddr
属性として使用できます。 peer はリモートホストのアドレス、 mailfrom はエンベロープの発信元、 rcpttos はエンベロープの受信者、 data はコンテンツを含む文字列です電子メールの( RFC 5321 形式である必要があります)。decode_data コンストラクターキーワードが
True
に設定されている場合、 data 引数はUnicode文字列になります。False
に設定されている場合、バイトオブジェクトになります。kwargs は、追加情報を含む辞書です。
decode_data=True
がinit引数として指定された場合は空です。指定されていない場合は、次のキーが含まれます。- mail_options :
MAIL
コマンドで受信したすべてのパラメーターのリスト(要素は大文字の文字列です。例:['BODY=8BITMIME', 'SMTPUTF8']
)。- rcpt_options :
mail_options と同じですが、
RCPT
コマンド用です。 現在、RCPT TO
オプションはサポートされていないため、今のところ、これは常に空のリストになります。
process_message
の実装では、**kwargs
署名を使用して、任意のキーワード引数を受け入れる必要があります。将来の機能拡張により、kwargsディクショナリにキーが追加される可能性があるためです。None
を返して、通常の250 Ok
応答を要求します。 それ以外の場合は、 RFC 5321 形式で目的の応答文字列を返します。
- channel_class
サブクラスでこれをオーバーライドして、SMTPクライアントの管理にカスタム SMTPChannel を使用します。
バージョン3.4の新機能: map コンストラクター引数。
バージョン3.5で変更: localaddr および remoteaddr にIPv6アドレスが含まれるようになりました。
バージョン3.5の新機能: decode_data および enable_SMTPUTF8 コンストラクターパラメーター、および kwargs パラメーターから process_message() decode_data が
False
の場合。バージョン3.6で変更: decode_data はデフォルトで
False
になりました。
DebuggingServerオブジェクト
- class smtpd.DebuggingServer(localaddr, remoteaddr)
- 新しいデバッグサーバーを作成します。 引数は SMTPServer のとおりです。 メッセージは破棄され、stdoutに出力されます。
PureProxyオブジェクト
- class smtpd.PureProxy(localaddr, remoteaddr)
- 新しい純粋なプロキシサーバーを作成します。 引数は SMTPServer のとおりです。 すべてが remoteaddr に中継されます。 これを実行すると、オープンリレーになる可能性が高いことに注意してください。注意してください。
MailmanProxyオブジェクト
- class smtpd.MailmanProxy(localaddr, remoteaddr)
- 新しい純粋なプロキシサーバーを作成します。 引数は SMTPServer のとおりです。 ローカルのmailman構成がアドレスを認識していない限り、すべてが remoteaddr に中継されます。アドレスについては、mailmanを介して処理されます。 これを実行すると、オープンリレーになる可能性が高いことに注意してください。注意してください。
SMTPChannelオブジェクト
- class smtpd.SMTPChannel(server, conn, addr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False)
サーバーと単一のSMTPクライアント間の通信を管理する新しい SMTPChannel オブジェクトを作成します。
conn および addr は、以下で説明するインスタンス変数によるものです。
data_size_limit は、
DATA
コマンドで受け入れられる最大バイト数を指定します。None
または0
の値は、制限がないことを意味します。enable_SMTPUTF8 は、
SMTPUTF8
拡張機能( RFC 6531 で定義)を有効にするかどうかを決定します。 デフォルトはFalse
です。 decode_data と enable_SMTPUTF8 を同時にTrue
に設定することはできません。map で辞書を指定して、グローバルソケットマップの使用を回避できます。
decode_data は、SMTPトランザクションのデータ部分をUTF-8を使用してデコードするかどうかを指定します。 デフォルトは
False
です。 decode_data と enable_SMTPUTF8 を同時にTrue
に設定することはできません。カスタムSMTPChannel実装を使用するには、 SMTPServer の SMTPServer.channel_class をオーバーライドする必要があります。
バージョン3.5で変更: decode_data および enable_SMTPUTF8 パラメーターが追加されました。
バージョン3.6で変更: decode_data はデフォルトで
False
になりました。SMTPChannel には、次のインスタンス変数があります。
- smtp_server
このチャネルを生成した SMTPServer を保持します。
- conn
クライアントに接続しているソケットオブジェクトを保持します。
- addr
クライアントのアドレスを保持します。2番目の値は socket.accept によって返されます。
- received_lines
クライアントから受信した(UTF-8を使用してデコードされた)行ストリングのリストを保持します。 これらの行の
"\r\n"
行の末尾は"\n"
に変換されます。
- smtp_state
チャネルの現在の状態を保持します。 これは、最初は
COMMAND
になり、クライアントが「DATA」行を送信した後はDATA
になります。
- seen_greeting
クライアントから送信された挨拶を含む文字列を「HELO」に保持します。
- mailfrom
クライアントからの「MAILFROM:」行で識別されたアドレスを含む文字列を保持します。
- rcpttos
クライアントからの「RCPTTO:」行で識別されたアドレスを含む文字列のリストを保持します。
- received_data
終了
"\r\n.\r\n"
までの、DATA状態中にクライアントによって送信されたすべてのデータを含む文字列を保持します。
- fqdn
socket.getfqdn()によって返されるサーバーの完全修飾ドメイン名を保持します。
- peer
conn.getpeername()
によって返されるクライアントピアの名前を保持します。ここで、conn
は conn です。
SMTPChannel は、クライアントからコマンドラインを受信すると、
smtp_<command>
という名前のメソッドを呼び出すことによって動作します。 基本の SMTPChannel クラスには、次のコマンドを処理する(およびそれらに適切に応答する)ためのメソッドが組み込まれています。指示
実行されたアクション
HELO
クライアントからのあいさつを受け入れ、 seen_greeting に保存します。 サーバーを基本コマンドモードに設定します。
EHLO
クライアントからのあいさつを受け入れ、 seen_greeting に保存します。 サーバーを拡張コマンドモードに設定します。
NOOP
何もしません。
終了する
接続をきれいに閉じます。
郵便物
「MAILFROM:」構文を受け入れ、指定されたアドレスを mailfrom として保存します。 拡張コマンドモードでは、 RFC 1870 SIZE属性を受け入れ、 data_size_limit の値に基づいて適切に応答します。
RCPT
「RCPTTO:」構文を受け入れ、指定されたアドレスを rcpttos リストに格納します。
RSET
mailfrom 、 rcpttos 、および received_data をリセットしますが、グリーティングはリセットしません。
データ
内部状態を
DATA
に設定し、ターミネーター"\r\n.\r\n"
が受信されるまで、クライアントからの残りの行を received_data に格納します。ヘルプ
コマンド構文に関する最小限の情報を返します
VRFY
コード252を返します(サーバーはアドレスが有効かどうかを知りません)
EXPN
コマンドが実装されていないことを報告します。