Электронная почта через .NET MailMessage удаляет вложение PDF в почтовом клиенте Windows 10

#c# #.net #email #email-attachments #mailmessage

Вопрос:

Мы получили сообщения о том, что клиенты получают наши электронные письма, но прилагаемый файл PDF отсутствует. Похоже, это происходит только с почтовым приложением Windows 10. При просмотре в веб-интерфейсе поставщика услуг электронной почты или в другом клиенте, таком как Thunderbird, можно найти файл PDF. Мы используем C#, .NET 4.7.2 и класс MailMessage для настройки наших электронных писем.

Электронное письмо состоит из:

  1. HTML-версия с коротким текстом и логотипом в формате PNG. Логотип встроен и на него ссылаются с помощью тега IMG и идентификатора содержимого изображения (CID).
  2. Обычная текстовая версия.
  3. Вложение в PDF-файл.

Мы определили, что проблема не возникает, если учетная запись электронной почты, просматриваемая в почтовом приложении Windows, является:

  • Учетная запись Outlook/Hotmail
  • Учетная запись Gmail

Проблема возникает, если вы вручную добавляете учетную запись электронной почты провайдера или хостинг-провайдера, используя дополнительные настройки почты Windows, чтобы вручную ввести данные своей учетной записи, настройки IMAP/SMTP-сервера и порта и т. Д. Мне удалось создать эту минимальную функцию для отправки электронного письма, которая приведет к отсутствию вложения при открытии в почте Windows:

 using System.IO; using System.Net.Mail;  public void SendEmail(SmtpClient smtpClient, string toEmailAddress, string fromEmailAddress,   string pngLogoImageFilePath, string pdfAttachmentFilePath) {  var email = new MailMessage();  email.To.Add(new MailAddress(toEmailAddress));  email.From = new MailAddress(fromEmailAddress, "Test Sender");  email.Subject = "Test";  email.IsBodyHtml = true;  email.BodyEncoding = Encoding.UTF8;   // Create the HTML version of the e-mail, including the IMG tag for showing the  // embedded image.  var htmlView = AlternateView.CreateAlternateViewFromString(  "lt;img src="cid:logoImage" /gt;lt;pgt;HTML VERSIONlt;/pgt;", null,  System.Net.Mime.MediaTypeNames.Text.Html);   // Create the plain text version of the e-mail.  var plainView = AlternateView.CreateAlternateViewFromString("PLAIN TEXT VERSION", null,   System.Net.Mime.MediaTypeNames.Text.Plain);   // Add the HTML and plain text versions as alternate views.  email.AlternateViews.Add(plainView);  email.AlternateViews.Add(htmlView);   // Create a linked resource for the logo image to be shown in the HTML version.  var logoImage = new LinkedResource(pngLogoImageFilePath, "image/png");  logoImage.ContentId = "logoImage";  htmlView.LinkedResources.Add(logoImage);   // Create the PDF file attachment.  var attachment = new Attachment(pdfAttachmentFilePath,   System.Net.Mime.MediaTypeNames.Application.Pdf);  attachment.Name = "test.pdf";   // Add attachment file information.  System.Net.Mime.ContentDisposition disposition = attachment.ContentDisposition;  disposition.FileName = attachment.Name;  disposition.Size = new FileInfo(pdfAttachmentFilePath).Length;  disposition.CreationDate = File.GetCreationTime(pdfAttachmentFilePath);  disposition.ModificationDate = File.GetLastWriteTime(pdfAttachmentFilePath);   email.Attachments.Add(attachment);    smtpClient.Send(email);    email.Dispose(); }  

Surprisingly, simply removing the LinkedResource for the PNG image makes Windows Mail show the PDF attachment. Comment the following line in the code and retry:

 htmlView.LinkedResources.Add(logoImage);  

Looking into the source of the generated emails, the non-working example has the following MIME boundaries:

 multipart/mixed  multipart/alternative  text/plain  multipart/related  text/html  image/png  multipart/mixed  application/pdf  

The working example has the following MIME boundaries:

 multipart/mixed  multipart/alternative  text/plain  text/html  multipart/mixed  application/pdf  

What I’d appreciate is if the community could help me answer:

  1. Видите ли вы что-нибудь неправильное в моем коде, что могло бы спровоцировать такое поведение?
  2. Можете ли вы найти какой-либо способ заставить этот пример работать должным образом с почтой Windows, не нарушая работу других клиентов? Например, я смог заставить почту Windows отображать как PNG, так и PDF, но для этого потребовалось сделать PNG встроенным вложением, которое сломало Thunderbird (логотип не показан в HTML, но включен в качестве обычного вложения).