#c# #.net #email #email-attachments #mailmessage
Вопрос:
Мы получили сообщения о том, что клиенты получают наши электронные письма, но прилагаемый файл PDF отсутствует. Похоже, это происходит только с почтовым приложением Windows 10. При просмотре в веб-интерфейсе поставщика услуг электронной почты или в другом клиенте, таком как Thunderbird, можно найти файл PDF. Мы используем C#, .NET 4.7.2 и класс MailMessage для настройки наших электронных писем.
Электронное письмо состоит из:
- HTML-версия с коротким текстом и логотипом в формате PNG. Логотип встроен и на него ссылаются с помощью тега IMG и идентификатора содержимого изображения (CID).
- Обычная текстовая версия.
- Вложение в 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:
- Видите ли вы что-нибудь неправильное в моем коде, что могло бы спровоцировать такое поведение?
- Можете ли вы найти какой-либо способ заставить этот пример работать должным образом с почтой Windows, не нарушая работу других клиентов? Например, я смог заставить почту Windows отображать как PNG, так и PDF, но для этого потребовалось сделать PNG встроенным вложением, которое сломало Thunderbird (логотип не показан в HTML, но включен в качестве обычного вложения).