2012-08-08 49 views
0

我有一些代码尝试接收从客户端上的服务器发送的电子邮件。电子邮件明确地从服务器发送到客户端,并且客户端上的SMTP服务器应该能够接收此电子邮件。下面是我的测试执行:如何通过smtpd和套接字接收电子邮件

# 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及其内容?

感谢 亚历克斯

+1

鉴于代码中出现的许多混淆以及对它的描述,这个问题目前的形式不能回答。这两个人指出,你似乎不了解smtp客户端和服务器之间的区别,要么你需要提高你的理解力,要么更好地表达你的问题。 – msw 2012-08-08 14:16:26

回答

1

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

+0

正如我所说的服务器网站是绝对的,完美的工作!我想在客户端收到一封电子邮件,该电子邮件已成功从服务器发送到客户端。 – Alex 2012-08-08 13:14:48

+0

您对“服务器”和“客户端”的概念偏离正常使用。无论如何,更新了答案。 – tripleee 2012-08-08 13:39:17

+0

也许有人知道一个示例脚本,它使用python在服务器和客户端之间进行适当的通信,以便接收电子邮件,而不使用asyncore?我已经搜索了几个小时,但没有例子出现。 – Alex 2012-08-08 14:10:55

1

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

你似乎混淆哪个进程是服务器。 smtpd模块创建服务器或邮件传输代理,而不是客户端。正如smtpd documentation for SMTPServer指出:

Create a new SMTPServer object, which binds to local address localaddr. It will treat remoteaddr as an upstream SMTP relayer. It inherits from asyncore.dispatcher, and so will insert itself into asyncore‘s event loop on instantiation.

也似乎有localaddrremoteaddr迷茫感。 localaddr不是(正如你的评论声明的那样)客户端的地址,但是该服务器应该接受来自哪个连接。您可能希望在的地方你的代码的尝试:

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

可与客户端代码进行测试(在一个单独的进程):

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

最后,具有无的remoteaddr一个PureProxy ,它如果能够工作,就会将代理邮件转为无处不在,这可能不是您想要的代理服务器。

+0

嗨, 与asyncore的设置是最初的设置接收电子邮件,这不起作用的第一位!因此,我开始实施套接字代码,以便查看发生了什么问题或有一个实现接收电子邮件的替代方法。 所以,如果任何人都可以回答我的原始问题,如何实现接收电子邮件与套接字没有任何asyncore。 非常感谢 亚历 – Alex 2012-08-08 13:52:11

+0

要乱写asyncore邮件传输代理会要求你重新发明smtpd的模块,这将要求您知道SMTP协议,该协议是相当复杂的。问题不在于与asyncore,它与你的理解。 – msw 2012-08-08 14:20:17

+0

这很可能是我的理解,还需要对系统的理解。发送邮件服务器收到以下错误回:“502错误:命令‘EHLO’没有实现”。这是否意味着我需要在我的Ubuntu机器上安装EHLO? – Alex 2012-08-08 14:38:18