Как я могу ответить на электронную почту, используя Python Imaplib и включить исходное сообщение?
Вопрос
В настоящее время я использую imaplib
Чтобы получить сообщения электронной почты с сервера и обрабатывать содержимое и вложения.
Я хотел бы ответить на сообщения с сообщением о состоянии / ошибки и ссылками на полученный сгенерированный контент на моем сайте, если они могут быть обработаны. Это должно включать в себя исходное сообщение, но должно бросить любые вложения (что будет большим) и предпочтительно заменить их только с их именами / размерами.
Поскольку я уже хожу запчасти сообщения MIME, я предполагаю, что мне нужно сделать, это построить новое дерево сообщения MIME, содержащее копию исходного сообщения и удаление / замена узлов вложения.
Прежде чем я начну этот путь, я надеялся, что кто-то может дать мне несколько советов. Есть ли какая-то функция библиотеки для этого? Любой вид стандартного поведения, которому я должен придерживаться?
В настоящее время я знаю / я использую imaplib
, smtplib
а также email
Модули и но, возможно, пропустили что-то очевидное там. Это тоже работает в Джангу, поэтому может использовать что-либо в django.core.email
Если это упрощает.
Решение
Оригинальная структура дерева MIME входящего сообщения заключается в следующем (используя email.iterators._structure(msg)
):
multipart/mixed
text/html (message)
application/octet-stream (attachment 1)
application/octet-stream (attachment 2)
Ответом через Gmail приводит к следующей структуре:
multipart/alternative
text/plain
text/html
Т.е. они не такие умные, как я думали, просто отбрасывая вложения (хорошо) и предоставление текстовых и HTML-версий, которые явно реструктурируют «цитируемый контент».
Я начинаю думать, что это все, что я тоже должен сделать, просто ответьте с простым сообщением, что после отброса вложений не так много точки сохранения оригинального сообщения.
Тем не менее, может также ответить на мой оригинальный вопрос, так как я понял, как сейчас сейчас.
Во-первых, замените все вложения в исходное сообщение с текстовыми / простыми заполняющими:
import email
original = email.message_from_string( ... )
for part in original.walk():
if (part.get('Content-Disposition')
and part.get('Content-Disposition').startswith("attachment")):
part.set_type("text/plain")
part.set_payload("Attachment removed: %s (%s, %d bytes)"
%(part.get_filename(),
part.get_content_type(),
len(part.get_payload(decode=True))))
del part["Content-Disposition"]
del part["Content-Transfer-Encoding"]
Затем создайте ответное сообщение:
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.message import MIMEMessage
new = MIMEMultipart("mixed")
body = MIMEMultipart("alternative")
body.attach( MIMEText("reply body text", "plain") )
body.attach( MIMEText("<html>reply body text</html>", "html") )
new.attach(body)
new["Message-ID"] = email.utils.make_msgid()
new["In-Reply-To"] = original["Message-ID"]
new["References"] = original["Message-ID"]
new["Subject"] = "Re: "+original["Subject"]
new["To"] = original["Reply-To"] or original["From"]
new["From"] = "me@mysite.com"
Затем прикрепите оригинальное объект MIME MESSOUSE и отправьте:
new.attach( MIMEMessage(original) )
s = smtplib.SMTP()
s.sendmail("me@mysite.com", [new["To"]], new.as_string())
s.quit()
Полученная структура:
multipart/mixed
multipart/alternative
text/plain
text/html
message/rfc822
multipart/mixed
text/html
text/plain
text/plain
Или это немного проще, используя Django:
from django.core.mail import EmailMultiAlternatives
from email.mime.message import MIMEMessage
new = EmailMultiAlternatives("Re: "+original["Subject"],
"reply body text",
"me@mysite.com", # from
[original["Reply-To"] or original["From"]], # to
headers = {'Reply-To': "me@mysite.com",
"In-Reply-To": original["Message-ID"],
"References": original["Message-ID"]})
new.attach_alternative("<html>reply body text</html>", "text/html")
new.attach( MIMEMessage(original) ) # attach original message
new.send()
Результат заканчивается (по меньшей мере, в Gmail), показывающий исходное сообщение как «---- переадресованное сообщение ----», что не совсем то, что я был после, но общая идея работает, и я надеюсь, что этот ответ поможет кому-то попытаться Выясните, как возиться с сообщениями MIME.