2014-10-22 9 views
1

그래서 간단한 텍스트 파일/TLS 메일을 지원하는 파이썬/트위스트 메일 서버가 필요합니다. 또한 smtplib을 사용하여 간단한 클라이언트 프로그램을 작성했습니다.python smtplib가 서버에서 광고 한 시작을 볼 수 없습니까?

# telnet localhost 5000 
Trying 127.0.0.1... 
Connected to localhost. 
Escape character is '^]'. 
220 localhost.localdomain NO UCE NO UBE NO RELAY PROBES ESMTP 
ehlo me 
250-localhost.localdomain Hello 127.0.0.1, nice to meet you 
250 STARTTLS 

모든 좋은 지금까지 다음과 같이 나 텔넷을 사용하여 내 서버에 연결하는 경우

는 ESMTP는, 내 EHLO, STARTTLS는 보급을 발행 한 후 후, 광고됩니다. , 그래서 사람들은 다음과 같습니다, 지금 시도와 같은 솔루션을 제안하고 있습니다 : 그러나, 나는 온라인 smtplib의 smtp_ssl 클래스에 관련된 버그 읽었습니다 (http://bugs.python.org/issue4066Failing to send email with the Python example 참조)

server = smtplib.SMTP('localhost', 5000) # my server is running on port 5000. Don't ask ;) 
server.ehlo() 
server.starttls('/opt/tesa/etc/certs/client/client.key', '/opt/tesa/etc/certs/client/client.crt') 
server.set_debuglevel(1) 
server.sendmail(fromaddr, toaddrs, msg) 
server.quit() 

을이 성공적으로 전송 내 메시지가 아니라 일반 텍스트를 통해 보입니다. 클라이언트의 출력은 서버의 EHLO 250 응답의 첫 번째 행 ("만나서 반갑습니다")을보고있는 것처럼 보이며 STARTTLS가 표시되지 않습니다. 따라서 서버가 자신의 STARTTLS를 발행하지 않는다고 가정합니다 (서버가 광고 한 경우에만이 작업을 수행하므로)? 따라서 일반 텍스트 메일로 유지됩니까?

# python smtplib_client.py 
From: [email protected] 
To: [email protected] 
Enter message, end with ^D (Unix) or ^Z (Windows): 
fsdfds 
Message length is 45 
**send: 'ehlo localhost.localdomain\r\n' 
reply: '250 localhost.localdomain Hello 127.0.0.1, nice to meet you\r\n' 
reply: retcode (250); Msg: localhost.localdomain Hello 127.0.0.1, nice to meet you 
send: 'mail FROM:<[email protected]>\r\n'** 
reply: '250 Sender address accepted\r\n' 
reply: retcode (250); Msg: Sender address accepted 
send: 'rcpt TO:<[email protected]>\r\n' 
reply: '250 Recipient address accepted\r\n' 
reply: retcode (250); Msg: Recipient address accepted 
send: 'data\r\n' 
reply: '354 Continue\r\n' 
reply: retcode (354); Msg: Continue 
data: (354, 'Continue') 
send: 'From: [email protected]\r\nTo: [email protected]\r\n\r\nfsdfds\r\n.\r\n' 
reply: '250 Delivery in progress\r\n' 
reply: retcode (250); Msg: Delivery in progress 
data: (250, 'Delivery in progress') 
send: 'quit\r\n' 
reply: '221 See you later\r\n' 
reply: retcode (221); Msg: See you later 

누구든지 나를 위해 조명을 켤 수 있습니까? 나는 어둠 속에서 여기있는 것처럼 보인다! 어느 때보 다

감사합니다 ...

답변

0

보낼 주장 응답 (파이썬 2.6.6 사용)

:

250-localhost.localdomain Hello 127.0.0.1, nice to meet you 
250 STARTTLS 

를 클라이언트에서 수신 된 하나를

reply: '250 localhost.localdomain Hello 127.0.0.1, nice to meet you\r\n' 

다른 모양 : 응답 코드 250과 호스트 이름 사이에 "-"가 없으므로 응답에 단 하나의 라인입니다. 파이썬 2.7과 3.3에서 smtplib.py에 대한 코드를 확인했고 '-'를 ''로 바꾸는 것과 같은 수정을 수행하지 않고 읽은 행을 디버그하기 위해서만 인쇄합니다.

그렇기 때문에 텔넷 예제와 smtplib 예제의 서버 버전이 다르고 후자의 예에서는 서버가 실제로 STARTTLS가 아닌 디버그에 표시된 것처럼 만 전송한다고 가정합니다.

"smtplib의 smtp_ssl 클래스에있는 버그를 온라인으로 읽었습니다"라는 참조를 추가하면 도움이 될 것입니다. 따라서이 문제와 관련된 내용을 확인할 수 있습니다. 그리고 사용중인 파이썬 버전을 추가하십시오.

+0

귀하의 요청에 따라 게시물이 업데이트되었습니다 ...하지만 뭔가를 발견해도 자신의 답변을 추가 할 것입니다 ... –

0

그래서 내가 이런 일이 생기게하기 위해 뭔가를 조정했는지, 아니면 방금 전에 놓쳤다는 생각이 들지 않습니다. (내가 가지고 있다고 생각하지는 마세요!) ... SMTPLIB 클라이언트는 여전히 아무것도 보이지 않습니다. STARTTLS와 관련된 로그 출력 그러나 서버 측 : 본인이 아는

2014-10-23 09:14:34+0000 [__builtin__.ConsoleSMTPFactory] Sending: 220: localhost.localdomain NO UCE NO UBE NO RELAY PROBES ESMTP 
2014-10-23 09:14:34+0000 [mySMTP,5,127.0.0.1] Sending: 250: localhost.localdomain Hello 127.0.0.1, nice to meet you 
2014-10-23 09:14:34+0000 [mySMTP,5,127.0.0.1] STARTTLS 
2014-10-23 09:14:34+0000 [mySMTP,5,127.0.0.1] Sending: 220: Begin TLS negotiation now 
2014-10-23 09:14:34+0000 [mySMTP,5,127.0.0.1] Sending: 250: localhost.localdomain Hello 127.0.0.1, nice to meet you 
2014-10-23 09:14:34+0000 [mySMTP,5,127.0.0.1] 
2014-10-23 09:14:34+0000 [mySMTP,5,127.0.0.1] Sending: 250: Sender address accepted 
2014-10-23 09:14:34+0000 [mySMTP,5,127.0.0.1] Sending: 250: Recipient address accepted 

는 서버는 클라이언트에서 STARTTLS의 영수증에 "지금 TLS 시작 협상의"를 보낼 것입니다. 그리고 위에 표시된 것처럼 발신자/수신자를 수락하면 TLS 협상이 성공한 것으로 나타납니다.

서버의 파이썬/꼬인 코드 (twisted의 smtp.py 모듈)를 보면 "250 - Hello 127.0.0.1"과 같은 메시지가 "self"를 통해 전송됩니다.sendCode "기능을 사용하지만 서버가 보낸 STARTTLS는"self.sendLine "을 사용합니다. 왜 그런 생각이 들지 모르겠군요. 내 생각에 왜곡 된 전문가가 필요합니다.

말하자면, 서버를 확인하는 방법을 찾아야합니다. TLS를 통한 메시지 - 즉, 채널을 확보했습니다 .... :)