2013-10-15 29 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

好的,如果這不是一個錯誤,而是一個功能,我很好;-)我只是認爲我的代碼是錯誤的。 –