【问题标题】:Receiving email with SMTPServer in python:在 python 中使用 SMTPServer 接收电子邮件:
【发布时间】:2017-09-06 18:02:52
【问题描述】:

我有一个在 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 库以简单的方式实现这一点,那就太好了!

干杯 亚历克斯

【问题讨论】:

    标签: python smtp


    【解决方案1】:

    1) Postfix 是一个 SMTP 服务器,它与 python 的 smtpd EHLO 实现无关。如果您想要自定义 SMTP 服务器,则不需要 postfix,因此请随意删除它。

    2) EHLO 是一个ESMTP 命令,而不是SMTP,标准的smtpd python 模块实现了SMTP,因此它没有EHLO 实现。

    【讨论】:

      【解决方案2】:

      试试这个。 当然,它并没有实现 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 似乎不向后兼容 - 祝你好运。

      【讨论】:

        猜你喜欢
        • 2016-08-03
        • 2014-10-18
        • 2013-02-21
        • 2010-09-25
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 2012-08-12
        • 2017-08-07
        相关资源
        最近更新 更多