如何通过smtpd和套接字接收电子邮件

时间:2012-08-08 13:01:48

标签: python sockets smtp

我有一些代码试图接收从客户端上的服务器发送的电子邮件。电子邮件最终从服务器发送到客户端,客户端上的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及其内容?

由于   亚历

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

  

创建一个新的SMTPServer对象,该对象绑定到本地地址   localaddr。它将remoteaddr视为上游SMTP中继器。它   继承自asyncore.dispatcher,因此将自身插入   asyncore在实例化时的事件循环。

您似乎也感到localaddrremoteaddr感到困惑。 localaddr不是(如您的评论所声称)客户端的地址,但该服务器应接受来自的连接。您可能想尝试代替您的代码:

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

可以使用客户端代码(在单独的过程中)测试:

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

最后,如果PureProxy的remoteaddr为None,那么无论如何都可以将邮件代理到任何地方,这可能不是你想要的代理邮件。