2014-06-18 9 views
1

python으로 이메일을 보내고 싶습니다. 그런 다음 메일 서버를 종료하고 스크립트의 이메일 내용을 사용하고 싶습니다. 예를 들어python smtpd 서버에서 텍스트를 검색하는 방법

:

if "any_string" in data: 
    print "success" 
    << exit mailserver >> 
    << any other commands >> 

코드 :

import smtpd 
import asyncore 

class FakeSMTPServer(smtpd.SMTPServer): 
    __version__ = 'TEST EMAIL SERVER' 

    def process_message(self, peer, mailfrom, rcpttos, data): 
     print 'Receiving message from:', peer 
     print 'Message addressed from:', mailfrom 
     print 'Message addressed to :', rcpttos 
     print 'Message length  :', len(data) 
     print 'Message    :', data 
     return 

if __name__ == "__main__": 
    smtp_server = FakeSMTPServer(('0.0.0.0', 25), None) 
    try: 
     asyncore.loop() 
    except KeyboardInterrupt: 
     smtp_server.close() 
+0

그리고 문제는 ...? – furas

+0

메일 서버를 종료하는 방법과 "any_string"에 대한 메시지를 검사하는 방법을 모르겠습니다. – user2534685

답변

1
당신은 process_message 방법 당신의 asyncore.close_all를 호출하여 asyncore 루프에서 종료 할 수 있습니다

:

def process_message(self, peer, mailfrom, rcpttos, data): 
    # ... 
    print 'Message    :', data 
    asyncore.close_all() 
    return 

편집

당신이 asyncore 루프에서 종료 한 후 메시지의 텍스트에 액세스 할 수 있도록하려면, 당신은 단순히 smtp 서버의 속성으로 저장합니다

#... 
class FakeSMTPServer(smtpd.SMTPServer): 
    def process_message(self, peer, mailfrom, rcpttos, data): 
     # ... 
     self.data = data 
     # ... 

if __name__ == "__main__": 
    smtp_server = FakeSMTPServer(('0.0.0.0', 25), None) 
    try: 
     asyncore.loop() 
    except KeyboardInterrupt: 
     smtp_server.close() 
    # smtp_server.data contains text of message 
+0

아주 좋습니다. 감사합니다 :)하지만 변수에 데이터 (메시지)를 가져 오는 방법은 무엇입니까? – user2534685

+1

@ user2534685 편집 후 ... –

+0

대단히 고마워요. 그것은 작동합니다 :) – user2534685

2

당신은 SMTP 세션을 닫는 SMTP.quit()를 사용할 수 있습니다. 당신은 단순히 문자열을 소문자로 변환 할 경우 (대문자/소문자)를 무시하려는 경우 귀하의 경우에 당신은 당신이 그렇게

data = 'my Test data' 
for word in data.split(): 
    if 'test' in word: 
     print "success" 

을 할 수있는 문자열에서 단어를 검색에 관한 smtp_server.quit()

처럼 사용할 수 있습니다 아래 그림과 같이 확인 후 lower() 및 사용 :

data = 'my Test data' 
for word in data.lower().split(): 
    if 'test' in word: 
     print "success" 

당신이 asyncore.loop()를 사용하여 다음 SMTP 서버를 시작하는 다른 스레드를 사용해야하고 당신이 할 수있는 동안 스크립트를 중지하려면 그것을 제어하십시오. 이 질문은 세부 사항을 설명합니다. How to handle asyncore within a class in python, without blocking anything?

+0

감사합니다.하지만 "smtp_server.quit()"를 사용할 수있는 곳은 어디입니까? 스크립트는 asyncore.loop()에 있습니다. – user2534685