2013-06-17 13 views
1

Я пишу систему для отправки массовых писем клиентам, и для каждого сайта мы храним 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-версии, которой я не хочу.

Любая помощь или идеи будут высоко оценены.

Заранее благодарим за любую помощь!

+0

Почему оба вида HTML и простой текстовый вид альтернативных видов? – Maciej

+0

Ну, я просто ухожу с учебников, которые я видел онлайн, поскольку никто не знает, что они делают. Я думал, вам придется создать две части для электронной почты, один HTML, один текст, а затем добавить их в многостраничную электронную почту с границами.Если что-то мне не хватает, то, пожалуйста, дайте мне знать, что я должен делать в отношении просмотра, поэтому я могу получить как HTML-код, так и текст, который я хочу. – user2334626

+0

Можете ли вы попробовать переключить две линии, где вы добавляете альтернативные виды? Сначала добавьте HTML. – Maciej

ответ

2

Ответ, похоже, на ошибку в классе MailMessage. Мне сказали сообщить об этом как таковой на форуме Microsoft .NET.

Похоже, что проблема заключается в использовании LinkedResources.

Если я удалю код, который добавляет LinkedResources к альтернативному представлению HTML, тогда код работает нормально, и я могу видеть как мои обычные текстовые, так и HTML-представления в моем почтовом клиенте.

Поэтому я должен оставить изображения как внешние ресурсы, которые загружаются в электронное письмо, когда пользователь нажимает кнопку «загрузить удаленный контент» в своем почтовом клиенте.

+0

Вы когда-нибудь подавали это как ошибку? – TWilly