0

我编写了一个小型 Python 守护程序,它从本地网络接收邮件并通过外部邮件提供商发送邮件。问题是,一旦建立连接,我可以发送一封电子邮件,但不能再发送一次。以下代码显示了问题:

我像这样连接服务器:

>>> from smtplib import SMTP
>>> smtp = SMTP()
>>> smtp.connect('mail.gmx.net', 587)
(220, b'gmx.com (mrgmx003) Nemesis ESMTP Service ready')
>>> smtp.login('XXX', 'XXX')
(235, b'Authentication succeeded')
>>> smtp.sendmail('XXX', 'XXX', '')
{}
>>> smtp.quit()
(221, b'gmx.com Service closing transmission channel')

一切正常,电子邮件已发送。但如果我稍后再做同样的事情,我会收到错误“503 Bad sequence of commands”。连接仍然有效:

>>> smtp.connect('mail.gmx.net', 587)
(220, b'gmx.com (mrgmx003) Nemesis ESMTP Service ready')

但这都不起作用:

>>> smtp.login('XXX', 'XXX')
(503, b'Bad sequence of commands')

也不是这个:

>>> smtp.sendmail('XXX', 'XXX', '')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python3.2/smtplib.py", line 749, in sendmail
    raise SMTPSenderRefused(code, resp, from_addr)
smtplib.SMTPSenderRefused: (503, b'Bad sequence of commands', 'XXX')

那么,这里有什么问题?如果我再次执行整个操作,从“smtp = SMTP()”开始,一切都会恢复正常。“smtp.quit()”不应该重置连接吗?

感谢大家的帮助!

4

2 回答 2

1

似乎很清楚,这个 SMTP 类的作者并不打算让实例在quit(). 而是创建一个新实例。

于 2013-10-15T21:10:45.317 回答
1

smtp.ehlo('XXX')在第二次会议中失踪了。尝试在.connect(). EHLOor ,视情况而HELO定,在第一个会话中隐式发送,但在第二个会话中不发送。如果您明确发送它,那么您的示例将起作用。

这可以说是 smtplib 中的一个错误。

于 2013-10-15T21:23:51.453 回答