【问题标题】:How to receive an email over smtpd and sockets如何通过 smtpd 和套接字接收电子邮件
【发布时间】:2012-08-05 14:19:27
【问题描述】:

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

谢谢 亚历克斯

【问题讨论】:

  • 鉴于代码中存在许多混淆以及您对它的描述,这个问题无法以目前的形式回答。那两个人指出你似乎没有理解 smtp 客户端和服务器之间的区别,要么你需要提高你的理解,要么更好地表达你的问题。

标签: python sockets smtp


【解决方案1】:

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

【讨论】:

  • 正如我所说的 SERVER 网站绝对完美!!!!我想在客户端收到一封邮件,已经成功从服务器发送到客户端。
  • 您对“服务器”和“客户端”的概念偏离了正常用法。无论如何,更新了答案。
  • 也许有人知道一个示例脚本,它使用 python 在服务器和客户端之间进行适当的通信,以便在不使用 asyncore 的情况下接收电子邮件?我用谷歌搜索了几个小时,但没有找到任何例子。
【解决方案2】:

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

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

创建一个新的 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')

最后,如果有一个 Remoteaddr 为 None 的 PureProxy,如果它可以正常工作,它会将邮件代理到任何地方,这可能不是您在代理中想要的。

【讨论】:

  • 您好,使用 asyncore 的设置是接收电子邮件的原始设置,这首先不起作用!因此,我开始实现套接字代码,以查看出了什么问题或有另一种实现电子邮件接收的方法。因此,如果有人可以回答我最初的问题,那么如何在没有任何异步的情况下使用套接字来接收电子邮件。非常感谢亚历克斯
  • 要编写一个没有 asyncore 的邮件传输代理将需要您重新发明 smtpd 模块,这需要您了解非常复杂的 SMTP 协议。问题不在于异步,而在于您的理解。
  • 这可能是我的理解,也可能是系统的理解。邮件发送服务器返回以下错误:“502 错误:命令“EHLO”未实现”。这是否意味着我需要在我的 ubuntu 机器上安装 EHLO?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多