Я пишу систему для отправки массовых писем клиентам, и для каждого сайта мы храним HTML и текстовую версию письма, чтобы, если почтовый клиент пользователя не делает 't поддержка HTML, текстовое представление все еще отформатировано правильно и, как мы хотим.Невозможно добавить альтернативный вид пользовательского текста в мой многостраничный адрес электронной почты
Мы не хотим просто генерировать версию обычного текста из HTML-версии, поскольку она добавляет множество ссылок на меню и другой текст, который не отформатирован так, как мы хотим.
Это прекрасно работает в ASP classic с компонентом электронной почты Persits = http://www.aspemail.com/ , поскольку мы добавляем строку HTML как Тело и текстовую строку в качестве AltBody.
Однако у меня возникли проблемы тиражирование это в C# .NET 4.5
Я следовал как много примеров, как это возможно, но мой метод, который возвращает объект MailMessage, который нужно передать HTML ищет изображений/баннеров, а затем заменить URLS с ContentID и LinkedResources каким-то образом возвращает электронное письмо, которое отлично смотрится в HTML и Simple HTML View (в Thunderbird).
Однако, что бы я ни делал, обычный текст выглядит всегда версией HTML, которую объект пытается преобразовать в текст RATHER, чем текстовая строка, которую мы предварительно отформатировали и хотим использовать.
Если я отлаживаю код, я вижу, что строка верна, прежде чем я добавлю ее в альтернативный вид, поэтому я не знаю, что мне еще нужно делать.
В моем методе, который разбирает 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, например, многостраничный адрес электронной почты с двумя границами, 1 для текстовой версии МЫ ХОТИМ ИСПОЛЬЗОВАТЬ, а другой - с версией HTML. Кажется, он всегда создает собственную версию Plain Text из HTML-версии, которой я не хочу.
Любая помощь или идеи будут высоко оценены.
Заранее благодарим за любую помощь!
Почему оба вида HTML и простой текстовый вид альтернативных видов? – Maciej
Ну, я просто ухожу с учебников, которые я видел онлайн, поскольку никто не знает, что они делают. Я думал, вам придется создать две части для электронной почты, один HTML, один текст, а затем добавить их в многостраничную электронную почту с границами.Если что-то мне не хватает, то, пожалуйста, дайте мне знать, что я должен делать в отношении просмотра, поэтому я могу получить как HTML-код, так и текст, который я хочу. – user2334626
Можете ли вы попробовать переключить две линии, где вы добавляете альтернативные виды? Сначала добавьте HTML. – Maciej