Я думаю, что вы ошиблись в том, как заменить заголовки в сообщении, и тот факт, что вам не нужно делать копию сообщения, вы можете просто воздействовать непосредственно на него после его создания из исходного кода. данные, полученные с сервера 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()
Надеюсь, это поможет, даже если этот ответ приходит довольно поздно.