3

我在 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

其中的情况是正在运行的后缀。停止 postfix 服务后,地址不再使用,但当然又回到问题 #1:

502 Error: command "EHLO" not implemented

我希望能够使用 SMTPServer 接收电子邮件 1. 无需安装 postfix 2. 使用 asyncore

如果有任何想法如何使用 python 库以简单的方式实现这一点,那就太好了!

干杯亚历克斯

4

2 回答 2

4

1) Postfix is an SMTP server, it has nothing to do with python's smtpd EHLO implementation. If you want your custom SMTP server, you don't need postfix, so feel free to remove it.

2) EHLO is a ESMTP command, not SMTP, standard smtpd python module implements SMTP, therefore it doesn't have an EHLO implementation.

于 2012-08-08T18:29:53.813 回答
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 似乎并不向后兼容 - 祝你好运。

于 2017-09-06T10:02:52.780 回答