2013-10-15 3 views
0

필자는 로컬, 네트워크에서 메일을 수신하고 외부 메일 공급자를 통해 보내는 작은 파이썬 데몬을 작성했습니다. 문제는 일단 연결이 설정되면 전자 메일을 한 번 보낼 수 있지만 다른 전자 메일은 보낼 수 없다는 것입니다.데몬에서 파이썬의 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() 바로 뒤에 추가해보십시오. 경우에 따라 EHLO 또는 HELO은 암시 적으로 첫 번째 세션에서는 전송되지만 두 번째 세션에서는 전송되지 않습니다. 명시 적으로 전송하면 예제가 작동합니다.

이것은 아마도 smtplib의 버그 일 것입니다.

+0

감사합니다. 실제로 SMTP를 다시 설정하지 않아도 코드가 작동합니다. 감사! –

1

이 SMTP 클래스 작성자가 quit() 이후에 인스턴스를 재활용하려고하지 않았 음이 분명합니다. 대신 새 인스턴스를 만듭니다.

+0

그래,이게 버그는 아니지만 기능이라면, 나는 괜찮다 ;-) 나는 내 코드로 뭔가 잘못되었다고 생각했다. –