我在Linux下有一个小应用程序来接收使用smtpd.SMTPServer的电子邮件。这是一个小测试代码:
class CustomSMTPServer(smtpd.SMTPServer):
def process_message(self, peer, mailfrom, rcpttos, data):
print 'Receiving message from:', peer
print 'Message addressed from:', mailfrom
print 'Message addressed to :', rcpttos
print 'Message length :', len(data)
return
server = CustomSMTPServer(('0.0.0.0', 25), None)
asyncore.loop()
我有以下问题: (1)使用这段代码时,发送电子邮件的计算机会收到以下消息: 502错误:命令“EHLO”未实现 所以服务器无法正确回复以接收更多数据/与电子邮件发送计算机(我假设是客户端)进行通信。
首先,不应该在Ubuntu安装中实现像EHLO这样的基本内容吗?为什么没有实施?
(2)我认为可以通过在Ubuntu中安装postfix来安装EHLO。我做了那个,同样的测试调用继续进行,但后来因为一个不同的错误而停止了:
Client: RCPT TO: XXX@YYY.com
Server: 554 5.7.1 <XXX@YYY>: Relay access denied
(3)稍后,在做了一些其他测试之后,我从测试代码本身得到了错误:
error: [Errno 98] Address already in use
事实证明,使用过的IP地址已经在使用,如
所示netstat -lnpt
其中案例是运行后缀。停止后缀服务后,该地址不再使用,但当然它又回到了问题#1:
502 Error: command "EHLO" not implemented
我希望能够使用SMTPServer接收电子邮件 1.无需安装postfix 2.使用asyncore
如果有任何关于如何使用python库以简单易用的方式实现这一点的想法,那就太棒了!
干杯 亚历
答案 0 :(得分:4)
1)Postfix是一个SMTP服务器,它与python的smtpd
EHLO实现无关。如果您需要自定义SMTP服务器,则不需要后缀,因此请随意将其删除。
2)EHLO
是ESMTP
命令,而不是SMTP
,标准smtpd
python模块实现SMTP
,因此它没有EHLO
1}}实施。
答案 1 :(得分:0)
试试这个。 当然,它没有实现EHLO命令,但是它使它与HELO命令一样对待它。当然,它可能只会让你通过第一个绊脚石,但是如果其余的smtp命令兼容,它可能会让你:
您可能会在/usr/lib/python2.7中找到smtpd.py文件
def smtp_HELO(self, arg):
if not arg:
self.push('501 Syntax: HELO hostname')
return
if self.__greeting:
self.push('503 Duplicate HELO/EHLO')
else:
self.__greeting = arg
self.push('250 %s' % self.__fqdn)
#copy the above function and rename it smtp_EHLO
def smtp_EHLO(self, arg):
if not arg:
self.push('501 Syntax: HELO hostname')
return
if self.__greeting:
self.push('503 Duplicate HELO/EHLO')
else:
self.__greeting = arg
self.push('250 %s' % self.__fqdn)
另外,我注意到同一个库的python3.5版本看起来它支持EHLO,所以也许你可以尝试使用python3。但显然python3似乎没有向后兼容 - 祝你好运。