Возникла странная проблема с электронными письмами, которые я отправляю через Python email
/ smtplib
.
Я пытаюсь составить письмо с:
- Альтернативы текстовых и HTML-сообщений.
- Изображение, встроенное в тело HTML
- Отдельное не встроенное вложение
Структура MIME настроена так:
multipart/mixed
multipart/alternative
text/plain
multipart/related
text/html
image/png - inline
application/pdf - attachment
Похоже, что это нормально работает на каждом почтовом клиенте, который я тестировал {BlueMail на Android, почтовый клиент iOS, Roundcube} , за исключением для почтового клиента Windows 10. По какой-то причине встроенный почтовый клиент Windows 10, кажется, показывает встроенное изображение просто отлично, но не показывает никаких следов другого вложения.
Ограниченная информация, которую я смог найти в интернете, указывает на то, что это ошибка почтового клиента Windows 10, но я лично получал другие электронные письма в этом клиенте с вложенными и вложенными вложениями, которые отображаются просто отлично - так что, очевидно, существует какая-то обходная / альтернативная структура сообщения, которая работает.
У меня такой вопрос: Как я могу по-разному отформатировать это сообщение, чтобы оно правильно отображалось во всех соответствующих почтовых клиентах?
Я пишу письмо в Python следующим образом:
message = MIMEMultipart("mixed")
message["From"] = ...
.
.
.
bodyText = "..."
bodyHTML = "..."
mailFrom = "..."
targetEmail = "..."
imageContent = ...
messageBody = MIMEMultipart("alternative")
messageBody.attach(MIMEText(bodyText, "plain"))
messageBodyHTML = MIMEMultipart("related")
messageBodyHTML.attach(MIMEText(bodyHTML, "html"))
messageImage = MIMEImage(imageContent)
messageImage.add_header("Content-Disposition", 'inline; filename="..."')
messageImage.add_header("Content-ID", "<id used in html body>")
messageBodyHTML.attach(messageImage)
messageBody.attach(messageBodyHTML)
message.attach(messageBody)
attachment = MIMEApplication(fileContent, Name=fileName)
attachment.add_header("Content-Disposition", 'attachment; filename="..."')
message.attach(attachment)
self.smtplibSession.sendmail(mailSource, targetEmail, message.as_string())
Обновление: Вот данные сообщения из почты Windows 10 (как вывод через функцию «сохранить» - нет возможности просмотреть исходные данные исходного сообщения, которые я могу найти ...)
MIME-Version: 1.0
Date: Thu, 30 May 2019 17:45:28 +0200
From: xxxxx <xxxxx>
Subject: xxxxx
Thread-Topic: xxxxx
To: "xxxxx" <xxxxx>
Content-Type: multipart/related;
boundary="_5D6C043C-FD42-42F9-B0E0-841DBFBA96D5_"
--_5D6C043C-FD42-42F9-B0E0-841DBFBA96D5_
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset="utf-8"
<center><img src=3D"cid:embedded-image" alt=...
--_5D6C043C-FD42-42F9-B0E0-841DBFBA96D5_
Content-Type: image/png; name="embedded-image.png"
Content-ID: <embedded-image>
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="embedded-image.png"
iVBORw0KGgoAAAAN...
--_5D6C043C-FD42-42F9-B0E0-841DBFBA96D5_--
Я не уверен, является ли это результатом сохранения электронной почты из приложения, или это то, что приложение на самом деле хранит, но кажется, что приложение Почта Windows 10 вырезает все, что не входит в раздел multipart/related
то есть он берет только выбранный alternative
и больше ничего не хранит.
Для сравнения, я нашел и экспортировал письмо, которое отображалось правильно, с изображением, html и вложением, но формат кажется намного проще - это письмо состояло только из слоя multipart/mixed
с text/html
и application/pdf
приложение. В этом письме вместо встраивания его в сообщение использовалось внешнее изображение, на которое есть ссылка в HTML - я хотел бы не размещать изображения в каждом письме извне.