2013-10-15 25 views
0

我已经编写了一个小型Python守护进程,它接收来自本地,网络的邮件并通过外部邮件提供程序发送它。问题是,如果一旦建立连接,我可以发送一次电子邮件,但不能发送另一个电子邮件。下面的代码显示的问题:我连接的服务器,像这样在守护进程中多次使用Python的SMTP

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

感谢您的帮助!

回答

1

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

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

+0

谢谢,它使代码实际上工作,而不必重新实例化SMTP。谢谢! –

1

它似乎相当清楚,这SMTP类的作者不打算为quit()后,被回收的情况。改为创建一个新实例。

+0

好的,如果这不是一个错误,而是一个功能,我很好;-)我只是认为我的代码是错误的。 –