C#发送HTML和Text电子邮件 – 最优雅?

发送HTML和Text电子邮件是最佳做法吗?

如果我只发送HTML有什么危险?

我正在考虑下面这样的事情

http://johnnycoder.com/blog/2009/04/15/net-mailmessage-linkedresources-alternateviews-and-exceptions/

try { // Assign a sender, recipient and subject to new mail message MailAddress sender = new MailAddress("sender@johnnycoder.com", "Sender"); MailAddress recipient = new MailAddress("recipient@johnnycoder.com", "Recipient"); MailMessage m = new MailMessage(sender, recipient); m.Subject = "Test Message"; // Define the plain text alternate view and add to message string plainTextBody = "You must use an email client that supports HTML messages"; AlternateView plainTextView = AlternateView.CreateAlternateViewFromString( plainTextBody, null, MediaTypeNames.Text.Plain); m.AlternateViews.Add(plainTextView); // Define the html alternate view with embedded image and // add to message. To reference images attached as linked // resources from your HTML message body, use "cid:contentID" // in the  tag... string htmlBody = "

Picture


" + ""; AlternateView htmlView = AlternateView.CreateAlternateViewFromString( htmlBody, null, MediaTypeNames.Text.Html); // ...and then define the actual LinkedResource matching the // ContentID property as found in the image tag. In this case, // the HTML message includes the tag // and the following // LinkedResource.ContentId is set to "SampleImage" LinkedResource sampleImage = new LinkedResource("sample.jpg", MediaTypeNames.Image.Jpeg); sampleImage.ContentId = "SampleImage"; htmlView.LinkedResources.Add(sampleImage); m.AlternateViews.Add(htmlView); // Finally, configure smtp or alternatively use the // system.net mailSettings SmtpClient smtp = new SmtpClient { Host = "smtp.example.com", UseDefaultCredentials = false, Credentials = new NetworkCredential("username", "password") }; // // // // // // // smtp.Send(m); } catch (ArgumentException) { throw new ArgumentException("Undefined sender and/or recipient."); } catch (FormatException) { throw new FormatException("Invalid sender and/or recipient."); } catch (InvalidOperationException) { throw new InvalidOperationException("Undefined SMTP server."); } catch (SmtpFailedRecipientException) { throw new SmtpFailedRecipientException( "The mail server says that there is no mailbox for recipient"); } catch (SmtpException ex) { // Invalid hostnames result in a WebException InnerException that // provides a more descriptive error, so get the base exception Exception inner = ex.GetBaseException(); throw new SmtpException("Could not send message: " + inner.Message); }

我想说,在今天的世界中,“最佳实践”方法是确保您以纯文本和HTML格式发送消息(如果您确实要发送HTML电子邮件消息)。

哦,并确保您实际上在纯文本视图中发送内容 ,而不是一句话说“您必须使用支持HTML消息的电子邮件客户端”。 谷歌邮件采用这种方式,它似乎完美地工作,允许在成熟的PC客户端上“丰富”的视图,同时还允许在更受限制的设备(即移动/手机)上“最小化”视图。

如果你想要一个纯粹主义者的观点,你根本不会发送HTML电子邮件,也不会将二进制文件“附加”到电子邮件中。 两种原始电子邮件标准的破坏,原本只是用于纯文本。 ( 在这里和这里看到一些人对此的看法)

然而,在务实的现代现实世界中,HTML电子邮件非常真实,而且非常可接受。 发送HTML电子邮件的主要缺点是收件人是否会以您希望他们看到的方式看到该电子邮件。 这与网页设计师多年来一直在争论的问题大致相同; 让他们的网站在所有可能的浏览器中看起来“恰到好处”(尽管今天它比很多年前容易得多)。

与确保网站正常运行而不需要 Javascript类似,通过将您的电子邮件作为HTML和纯文本发送,您将确保您的电子邮件优雅地降级,以便人们在(例如)小型移动设备上阅读他们的电子邮件(这些东西正在成为如今越来越流行 – 可能会或可能不会呈现完整的HTML电子邮件 – 仍然可以毫无问题地阅读您的电子邮件内容。

如果您只发送HTML,那么在纯文本设备上阅读电子邮件的任何人都会遇到问题。

例如,我怀疑许多低端移动设备能够阅读电子邮件但不能显示完整的HTML。

我会说最好的做法发送纯文本,文本和HTML。

我不明白你为什么要捕获一堆例外只是为了用不同的消息重新抛出相同的exception类型,顺便说一下 – 原始消息可能更具描述性。

发送两者的另一个原因是许多邮件服务器将仅包含HTML内容的电子邮件标记为垃圾邮件。 您不希望所有电子邮件都放在垃圾文件夹中。

我想是的,最佳做法是发送两者。 原因(来自维基百科的c&p):

根据RFC 2822的默认电子邮件格式是纯文本。 因此,不需要电子邮件软件来支持HTML格式化。 因此,如果发送HTML格式的电子邮件是其中一个不支持它的客户端,则可能会在收件人端产生问题。 在最坏的情况下,收件人将看到HTML代码而不是预期的消息。

多个电子邮件客户端将使用添加到AlternateViews的最后一个AlternateView。

因此,如果您希望将邮件显示为HTML,请务必在最后添加。

我已经注意到这个用于IOS邮件和OSX邮件,而Android Email似乎更喜欢HTML(如果可用)。 我不确定它拥有哪些版本,并且行为通常是用户可配置的,但根据我的经验,这些是默认值。

分享我在一封电子邮件中发送HTML和文本的经验:我创建了一个包含2个视图的电子邮件:使用C#AlternateView类的text和html。

我得到了什么?

在Mac上,在High Sierra上测试: Apple Mail应用程序显示了Html。 如果消息顺序颠倒:Html – 文本然后Apple Mail将显示文本视图。 结论:Apple Mail使用上一个视图作为默认视图。

在Windows中,Outlook 2010: Microsoft Outlook默认使用Html视图。 电子邮件中的视图顺序无关紧要:html,text; 文本,HTML;

如果由于某种原因您选择了一个设置以将收到的邮件显示为文本,那么您的电子邮件的Html版本将由Outlook转换为文本。 即使如此,您发送电子邮件的文本版本(可能与HTML版本略有不同,并且格式化为漂亮),它将不会被使用。

因此,如果您知道客户使用Outlook并且Html版本被选为默认版本,则无需发送电子邮件的文本版本。

Mozilla Thunderbird尊重您的设置并显示您电子邮件的正确Html或文本版本。 它可以在Mac和Windows上正常运行

希望能帮助到你