0

クライアントのサーバーから送信された電子メールを受信しようとするコードがあります。電子メールはサーバーからクライアントに確実に送信され、クライアントの SMTP サーバーはこの電子メールを受信できる必要があります。これが私のテスト実装です:

# define the SMTP server (with the real IP adress of the client of course)
server = smtpd.PureProxy(('XXX.XXX.XXX.XXX', 25), None)        
inputs = [server]
outputs = []
message_queues = {}
readable, writable, exceptional = select.select(inputs, outputs, inputs)

# Only one socket in the list returned (there is exactly one)
socket = readable[0]

# Accept the connection or get it or whatever
connection, client_address = socket.accept()

# get the data
data = connection.recv(1024)
print data

かなり長い時間が経過した後、電子メールの内容とはまったく似ていないデータが受信されます。いつものこと

EHLO YYY.YYY.YYY.YYY

YYY はサーバーのアドレスです。私は SMTP とソケットの専門家ではありませんが、email とその内容を正しく受信するために何が間違っているのでしょうか?

ありがとうアレックス

4

2 に答える 2

1

これが、ESMTPプロトコルダイアログの適切な開始です。プログラムは、少なくとも基本的なSMTP動詞を理解して処理する必要があります。RFC5321を参照してください。

于 2012-08-08T13:08:59.990 に答える
1

はSMTP プロトコル交換EHLO一部であり、クライアントがグリーティングをサーバーに送信することを表しますが、サーバーは適切に応答しません (サーバーがまったく応答しないため)。クライアントが「かなり長い時間」待つのに飽きると、セッションがタイムアウトになり、サーバーは受信したものを表示します。

どのプロセスがサーバーであるかについて混乱しているようです。smtpd モジュールは、クライアントではなく、サーバーまたはメール転送エージェントを作成します。SMTPServerのsmtpd ドキュメントに記載されているとおり:

ローカル アドレス localaddr にバインドする新しい SMTPServer オブジェクトを作成します。remoteaddr を上流の SMTP リレイヤーとして扱います。これは asyncore.dispatcher から継承されているため、インスタンス化時に asyncore のイベント ループに自身を挿入します。

localaddrあなたはまた、remoteaddr混乱した感覚を持っているようです。localaddr は(コメントが主張するように)クライアントのアドレスではありませんが、そのサーバーが接続を受け入れる場所です。あなたのコードの代わりに試してみてください:

server = smtpd.DebuggingServer(('localhost', 2525), None)
asyncore.loop()

次のクライアント コードを (別のプロセスで) 使用してテストできます。

client smtplib.SMTP('localhost', 2525)
client.sendmail('from', 'to', 'body')

最後に、None の remoteaddr を持つ PureProxy を使用すると、それが機能したとしても、メールがどこにもプロキシされず、おそらくプロキシに必要なものではありません。

于 2012-08-08T13:37:49.310 に答える