Многочастные / смешанные вложения электронной почты не отображаются, но только в Почте Windows 10 - PullRequest
11 голосов
/ 30 мая 2019

Возникла странная проблема с электронными письмами, которые я отправляю через 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 - я хотел бы не размещать изображения в каждом письме извне.

1 Ответ

3 голосов
/ 06 июня 2019

В отличие от вас, с файлом вложения проблем не было, вместо этого у меня были проблемы с отображением встроенных изображений (Windows 10 Mail 16005.11629.20174.0).

К сожалению, правильная обработка нестандартных подходов в сообщениях MIME - это функция, которая, как ожидается, будет иметь хорошие почтовые клиенты. Судя по всему, Windows 10 Mail еще не так хороша.

Структура, которую я рекомендую вам использовать:

multipart/mixed
├─── multipart/related
│   ├─── multipart/alternative
│   │   ├─── text/plain
│   │   └─── text/html
│   └─── image/png - inline image
└─── application/pdf - attachment

У меня не было проблем с этой структурой в следующих клиентах.

  • Windows 10 Mail
  • Gmail Web & Android
  • Outlook Web, Android и Windows Desktop
  • Blue Mail Android
  • Roundcube Web
  • MailEnable Web

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

message = MIMEMultipart("mixed")
message["From"] = ...
.
.
.
bodyText = "..."
bodyHTML = "..."
mailFrom = "..."
targetEmail = "..."
imageContent = ...
fileContent = ...

relatedBody = MIMEMultipart("related")

messageBody = MIMEMultipart("alternative")
messageBody.attach(MIMEText(bodyText, "plain"))
messageBody.attach(MIMEText(bodyHTML, "html"))

relatedBody.attach(messageBody)

messageImage = MIMEImage(imageContent)
messageImage.add_header("Content-Disposition", 'inline; filename="..."')
messageImage.add_header("Content-ID", "<id used in html body>")

relatedBody.attach(messageImage)

message.attach(relatedBody)

attachment = MIMEApplication(fileContent)
attachment.add_header("Content-Disposition", 'attachment; filename="..."')

message.attach(attachment)
...