smtpd — SMTPサーバー—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/smtpd
移動先:案内検索

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リレーとして扱います。 localaddrremoteaddr はどちらも、(ホスト、ポート)タプルである必要があります。 オブジェクトは asyncore.dispatcher を継承しているため、インスタンス化時に asyncore のイベントループに挿入されます。

data_size_limit は、DATAコマンドで受け入れられる最大バイト数を指定します。 Noneまたは0の値は、制限がないことを意味します。

map は、接続に使用するソケットマップです(最初は空の辞書が適切な値です)。 指定しない場合、 asyncore グローバルソケットマップが使用されます。

enable_SMTPUTF8 は、SMTPUTF8拡張機能( RFC 6531 で定義)を有効にするかどうかを決定します。 デフォルトはFalseです。 Trueの場合、SMTPUTF8MAILコマンドのパラメーターとして受け入れられ、存在する場合はkwargs['mail_options']process_message()に渡されます。 ]リスト。 decode_dataenable_SMTPUTF8 を同時にTrueに設定することはできません。

decode_data は、SMTPトランザクションのデータ部分をUTF-8を使用してデコードするかどうかを指定します。 decode_dataFalse(デフォルト)の場合、サーバーは8BITMIME拡張子( RFC 6152 )をアドバタイズし、 BODY=8BITMIMEパラメータをMAILコマンドに渡し、存在する場合はkwargs['mail_options']リストの process_message()に渡します。 decode_dataenable_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_dataFalseの場合。

バージョン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_dataenable_SMTPUTF8 を同時にTrueに設定することはできません。

map で辞書を指定して、グローバルソケットマップの使用を回避できます。

decode_data は、SMTPトランザクションのデータ部分をUTF-8を使用してデコードするかどうかを指定します。 デフォルトはFalseです。 decode_dataenable_SMTPUTF8 を同時にTrueに設定することはできません。

カスタムSMTPChannel実装を使用するには、 SMTPServerSMTPServer.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()によって返されるクライアントピアの名前を保持します。ここで、connconn です。

SMTPChannel は、クライアントからコマンドラインを受信すると、smtp_<command>という名前のメソッドを呼び出すことによって動作します。 基本の SMTPChannel クラスには、次のコマンドを処理する(およびそれらに適切に応答する)ためのメソッドが組み込まれています。

指示

実行されたアクション

HELO

クライアントからのあいさつを受け入れ、 seen_greeting に保存します。 サーバーを基本コマンドモードに設定します。

EHLO

クライアントからのあいさつを受け入れ、 seen_greeting に保存します。 サーバーを拡張コマンドモードに設定します。

NOOP

何もしません。

終了する

接続をきれいに閉じます。

郵便物

「MAILFROM:」構文を受け入れ、指定されたアドレスを mailfrom として保存します。 拡張コマンドモードでは、 RFC 1870 SIZE属性を受け入れ、 data_size_limit の値に基づいて適切に応答します。

RCPT

「RCPTTO:」構文を受け入れ、指定されたアドレスを rcpttos リストに格納します。

RSET

mailfromrcpttos 、および received_data をリセットしますが、グリーティングはリセットしません。

データ

内部状態をDATAに設定し、ターミネーター"\r\n.\r\n"が受信されるまで、クライアントからの残りの行を received_data に格納します。

ヘルプ

コマンド構文に関する最小限の情報を返します

VRFY

コード252を返します(サーバーはアドレスが有効かどうかを知りません)

EXPN

コマンドが実装されていないことを報告します。