在守护进程中不止一次使用Python的SMTP

时间:2013-10-15 20:55:23

标签: python smtp smtplib

我编写了一个小型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错误的命令序列”。连接仍然有效:

>>> 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()”重置连接?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

很明显,此SMTP类的作者并不打算在quit()之后回收实例。改为创建一个新实例。

答案 1 :(得分:1)

您在第二个会话中缺少smtp.ehlo('XXX')。请尝试在.connect()之后立即添加。 EHLOHELO视情况而定,在第一个会话中隐式发送,但不在第二个会话中发送。如果您明确发送,那么您的示例将起作用。

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