Пересылка электронного письма с помощью python smtplib - PullRequest
10 голосов
/ 27 апреля 2010

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

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

Вот что у меня есть (клиент - это соединение с imaplib.IMAP4, а 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'] = 'source.email.address@domain.com'
forward['To'] = 'my.email.address@gmail.com'

smtp.sendmail(user, ['my.email.address@gmail.com'], forward.as_string())

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

# This doesn't work either, it just freezes...?
mail['From'] = 'source.email.address@domain.com'
mail['To'] = 'my.email.address@gmail.com'
smtp.sendmail(user, ['my.email.address@gmail.com'], mail.as_string())

Ответы [ 2 ]

18 голосов
/ 31 декабря 2010

Я думаю, что вы ошиблись в том, как заменить заголовки в сообщении, и тот факт, что вам не нужно делать копию сообщения, вы можете просто воздействовать непосредственно на него после его создания из исходного кода. данные, полученные с сервера 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 = "from.me@example.com"
to_addr = "to.you@example.com"

# 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 голосов
/ 20 декабря 2010

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

...