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 和套接字方面的专家,但是我在正确接收 emai 及其内容方面做错了什么?

谢谢亚历克斯

4

2 回答 2

1

EHLOSMTP 协议交换的一部分,它代表客户端向您的服务器发送问候语,但该服务器没有正确响应(因为它根本没有响应)。当客户端厌倦了等待“相当长的时间”时,会话超时并且您的服务器显示它收到的内容。

您似乎对哪个进程是服务器感到困惑。smtpd 模块创建服务器或邮件传输代理,而不是客户端。如SMTPServer 的 smtpd 文档中所述:

创建一个新的 SMTPServer 对象,该对象绑定到本地地址 localaddr。它将 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 的 PureProxy,如果它可以正常工作,它会将邮件代理到任何地方,这可能不是您在代理中想要的。

于 2012-08-08T13:37:49.310 回答
1

这是 ESMTP 协议对话框的正确开始。您的程序至少需要理解和处理基本的 SMTP 动词;见RFC5321

于 2012-08-08T13:08:59.990 回答