Не получается добавить пользовательский текстовый альтернативный вид в мою составную электронную почту
Я пишу систему для рассылки массовых электронных писем клиентам, и для каждого сайта мы храним HTML и текстовую версию электронной почты, чтобы, если почтовый клиент пользователей не поддерживает HTML, текстовое представление по-прежнему форматировалось правильно и так, как мы хотим.
Мы не хотим просто генерировать текстовую версию из HTML-версии, так как она добавляет множество ссылок на меню и другой текст, который не отформатирован так, как мы хотим.
Это хорошо работает в ASP classic с Persits Email Component = http://www.aspemail.com/ как мы добавляем строку HTML в качестве тела и текстовую строку в качестве AltBody.
Однако у меня возникают проблемы с репликацией этого в C# .NET 4.5
Я следовал как можно большему количеству примеров, но мой метод, который возвращает объект MailMessage, который должен передать HTML в поисках изображений / баннеров, а затем заменить URL-адреса на ContentIDs, а LinkedResources каким-то образом возвращает электронное письмо, которое отлично выглядит в HTML и Simple HTML View. (в Thunderbird).
Однако, что бы я ни делал, представление в виде простого текста, похоже, всегда является версией HTML, которую объект пытается преобразовать в текст ДАЛЕЕ, чем текстовая строка, которую мы предварительно отформатировали и хотим использовать.
Если я отлаживаю код, я вижу, что строка правильная, прежде чем добавить ее в альтернативное представление, поэтому я не знаю, что еще мне нужно сделать.
В моем методе, который анализирует HTML, добавляет связанные ресурсы и возвращает объект MailMessage, у меня есть следующий код:
<pre>
/* I pass in a custom SiteEmail object with 2 properties HTMLEmail and TextEmail that hold both versions of the email */
public MailMessage ParseEmailImages(SiteEmail siteEmail)
{
MailMessage email = new MailMessage();
// extract the HTML version as we need to parse it to swap URLs for ContentID/Resources and paths etc
string HTML = siteEmail.HTMLEmail;
// this is a generic list to hold all my picture resource objects that I find (swapping image URLs to paths and contentIDs)
List<LinkedResource> pictureResources = new List<LinkedResource>();
// code to find all the paths, create image resource objects and add them to my list - and modify the HTML to reference
// the new ContentIDs I swap the URLs for so the images are embedded in the email
// ..... code .....
// finished finding resource objects build email parts and return to caller
// Add each alternate view to the message.
// add the HTML view using my newly parsed HTML string
ContentType HtmlContentType = new ContentType("text/html; charset=UTF-8");
AlternateView altViewHTML = AlternateView.CreateAlternateViewFromString(HTML, HtmlContentType);
altViewHTML.TransferEncoding = TransferEncoding.QuotedPrintable;
// when I check here the siteEmail.TextEmail holds the CORRECT textual string I want BUT it's not displaying in the sent email
ContentType PlainContentType = new ContentType("text/plain; charset=UTF-8");
// as we didn't need to change anything in the text view we can just reference it straight out my custom email object siteEmail
AlternateView altViewText = AlternateView.CreateAlternateViewFromString(siteEmail.TextEmail, PlainContentType);
altViewText.TransferEncoding = TransferEncoding.QuotedPrintable;
// loop through all my picture resource objects and ensure they are embedded into the HTML email
foreach (LinkedResource pictureResource in pictureResources)
{
pictureResource.TransferEncoding = TransferEncoding.Base64;
altViewHTML.LinkedResources.Add(pictureResource);
}
// add both parts of the email (text/html) which are both alternative views to message
email.AlternateViews.Add(altViewText);
email.AlternateViews.Add(altViewHTML);
// return email object
return email;
}
// a very cut down example of the calling method
public bool SendEmail()
{
// parse our email object
MailMessage EmailMailMessage = this.ParseEmailImages(this.SiteEmail);
// send email
EmailMailMessage.From = new MailAddress(this.SendFromEmail, this.SendFromName);
EmailMailMessage.Subject = this.SendSubject;
// ensure encoding is correct for Arabic/Japanese sites and body transfer method is correct
EmailMailMessage.BodyEncoding = Encoding.UTF8;
EmailMailMessage.BodyTransferEncoding = TransferEncoding.QuotedPrintable;
SmtpClient client = new SmtpClient();
// this in a try catch and more complex
client.Send(this.EmailMailMessage);
}
</pre>
Я попытался поиграть с форматами кодирования, просто добавив одно альтернативное представление и т. Д., Но не могу заставить его отправлять то же электронное письмо, что и мой старый код ASP Classic, например, составное электронное письмо с 2 границами, 1 для текстовой версии WE ХОТИТЕ ИСПОЛЬЗОВАТЬ и один с версией HTML. Кажется, что всегда создается собственная версия в формате обычного текста из HTML-версии, чего я не хочу.
Любая помощь или идеи будут высоко ценится.
Заранее благодарю за любую помощь!
1 ответ
Кажется, ответ таков: в классе MailMessage есть ошибка. Мне сказали сообщить об этом на форуме Microsoft .NET.
Похоже, проблема заключается в использовании LinkedResources.
Если я удаляю код, который добавляет LinkedResources в альтернативное представление HTML, то код работает нормально, и я вижу мои обычные и HTML-представления в моем почтовом клиенте.
Поэтому я должен оставить изображения как внешние связанные ресурсы, которые загружаются в электронную почту, когда пользователь нажимает любую кнопку "загрузить удаленный контент" в своем почтовом клиенте.