2010-04-26 2 views
8

특정 조건과 일치하는 특정 전자 메일을 자동으로 다른 전자 메일로 전달하는 스크립트를 작성하려고합니다.python smtplib을 사용하여 전자 메일 전달

imaplib 및 전자 메일을 사용하여 메시지를 다운로드하고 구문 분석했지만 전체 전자 메일을 다른 주소로 전달하는 방법을 알 수 없습니다. 처음부터 새 메시지를 작성해야합니까, 아니면 이전 메시지를 수정하고 다시 보낼 수 있습니까? 여기

내가 지금까지 가지고 무엇을 (클라이언트는 imaplib.IMAP4 연결하고, ID는 메시지 ID입니다) : 나는 관련 일을 할 필요가 약간 더 복잡한 뭔가가있을거야

import smtplib, imaplib 

smtp = smtplib.SMTP(host, smtp_port) 
smtp.login(user, passw) 

client = imaplib.IMAP4(host) 
client.login(user, passw) 
client.select('INBOX') 

status, data = client.fetch(id, '(RFC822)') 
email_body = data[0][1] 
mail = email.message_from_string(email_body) 

# ...Process message... 

# This doesn't work 
forward = email.message.Message() 
forward.set_payload(mail.get_payload()) 
forward['From'] = '[email protected]' 
forward['To'] = '[email protected]' 

smtp.sendmail(user, ['[email protected]'], forward.as_string()) 

메시지의 MIME 내용 물론 전체 메시지를 전달하는 간단한 방법이 있습니까? 내가 POP3를 통해 메시지를 다운로드

# This doesn't work either, it just freezes...? 
mail['From'] = '[email protected]' 
mail['To'] = '[email protected]' 
smtp.sendmail(user, ['[email protected]'], mail.as_string()) 
+0

결정을 내리기에 너무 많은 문맥이 누락되었습니다. 특히 표준 smtplib을 사용하고 있습니까? 어떤 버전의 파이썬. smtp가 초기화 된 위치는 connect()입니까? 적절한 헬로 응답을 받았습니까? – msw

+0

표준 smtplib, python2.6.4입니다. smtplib 클라이언트가 정상적으로 작동합니다. smtp의 마지막 인수로 문자열을 전달하여 간단한 텍스트 전자 메일을 보낼 수 있습니다. 다운로드 한 메시지의 전체 MIME 내용을 새 주소로 보내는 간단한 방법을 찾고 싶습니다. – robbles

답변

16

내가 잘못 생각한 부분은 메시지의 헤더를 대체하는 방법이었고 메시지의 복사본을 만들 필요가 없다는 것을 생각하면 메시지에서 메시지를 만든 후에 바로 메시지를 조작 할 수 있습니다. IMAP 서버에서 가져온 원시 데이터

일부 세부 사항을 생략 했으므로 모든 세부 사항이 나와있는 완전한 솔루션입니다. IMAP 단계와 SMTP 단계를 서로 분리 했으므로 STARTTLS 모드로 SMTP 연결을 설정하고 있습니다. IMAP 서버에서 메시지를 변경하면 어떻게 되겠습니까? 그렇게했다면, 그렇게되지 않는다는 것을 분명히 보여줄 것입니다.

import smtplib, imaplib, email 

imap_host = "mail.example.com" 
smtp_host = "mail.example.com" 
smtp_port = 587 
user = "xyz" 
passwd = "xyz" 
msgid = 7 
from_addr = "[email protected]" 
to_addr = "[email protected]" 

# open IMAP connection and fetch message with id msgid 
# store message data in email_data 
client = imaplib.IMAP4(imap_host) 
client.login(user, passwd) 
client.select('INBOX') 
status, data = client.fetch(msgid, "(RFC822)") 
email_data = data[0][1] 
client.close() 
client.logout() 

# create a Message instance from the email data 
message = email.message_from_string(email_data) 

# replace headers (could do other processing here) 
message.replace_header("From", from_addr) 
message.replace_header("To", to_addr) 

# open authenticated SMTP connection and send message with 
# specified envelope from and to addresses 
smtp = smtplib.SMTP(smtp_host, smtp_port) 
smtp.starttls() 
smtp.login(user, passwd) 
smtp.sendmail(from_addr, to_addr, message.as_string()) 
smtp.quit() 

이 답변이 상당히 늦어지기를 바랍니다.

0

응용 프로그램 하나에 즉 (poplib 사용)하고 두 번째 방법을 사용하여 전달, 나는 원래 메시지에로/변경하고 보내, 그것은 작동합니다.
smtp.sendmail을 멈추려 고 시도한 적이 있습니까?

관련 문제