2010-04-26 3 views
8

Я пытаюсь собрать сценарий, который автоматически пересылает определенные письма, соответствующие конкретным критериям, на другое электронное письмо.Пересылка электронной почты с python smtplib

У меня есть загрузка и разбор сообщений с использованием imaplib и электронной почты, но я не могу понять, как перенаправить целое электронное письмо на другой адрес. Нужно ли мне создавать новое сообщение с нуля, или я могу каким-то образом изменить старый и повторно отправить его?

Вот что я до сих пор (клиент соединение imaplib.IMAP4, и идентификатор представляет собой идентификатор сообщения):

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'] = 'source.email.address[email protected]' 
forward['To'] = '[email protected]' 

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

Я уверен, что есть что-то немного более сложным, я должен делать в отношении к содержимому MIME сообщения. Конечно, есть простой способ просто переслать все сообщение?

# 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? Какая версия Python. Где инициализируется smtp, это connect() ed? Получили ли вы надлежащий ответ HELO? – msw

+0

Это стандартный smtplib, python2.6.4. Клиент smtplib работает нормально - я могу отправлять простые текстовые сообщения, передавая строку в качестве последнего аргумента smtp. Я просто хочу найти простой способ отправки всего содержимого MIME загруженного сообщения на новый адрес. – robbles

ответ

16

Я думаю, что часть, в которой вы ошибались, заключалась в том, как заменить заголовки в сообщении и на то, что вам не нужно делать копию сообщения, вы можете просто работать непосредственно с ней после создания ее из необработанные данные, полученные с сервера IMAP.

Вы пропустили некоторые детали, так что вот мое полное решение со всеми деталями, прописанными. Обратите внимание, что я помещаю SMTP-соединение в режим STARTTLS, так как мне это нужно, и обратите внимание, что я отделил фазу IMAP и фазу 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

В одно приложение I загрузки сообщений через POP3 (используя poplib) и пересылать их с помощью второго метода ... То есть, я изменить К/С на исходное сообщение и отправить его, и он работает.
Вы пробовали вытаскивать внутри smtp.sendmail, чтобы посмотреть, где он остановился?

Смежные вопросы