在.net中以HTML和纯文本格式发送邮件

我使用SmtpClient从C#应用程序发送邮件。 很好用,但我必须决定是否要以纯文本或HTML格式发送邮件。 我想知道,有没有办法同时发送? 我认为这就是所谓的多部分。

我google了一下,但大多数的例子本质上并没有使用SmtpClient,但组成了整个SMTP身体本身,这有点“可怕”,所以我不知道是否有什么东西是build立在.NET Framework 3.0?

如果没有,是否有任何真正好用/强大的第三方库发送电子邮件?

你想要做的是使用MailMessage上的AlternateViews属性

http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.alternateviews.aspx

MSDN文档似乎错过了一件事情,但我必须手动设置内容types,否则,它的作品就像一个魅力:-)

MailMessage msg = new MailMessage(username, nu.email, subject, body); msg.BodyEncoding = Encoding.UTF8; msg.SubjectEncoding = Encoding.UTF8; AlternateView htmlView = AlternateView.CreateAlternateViewFromString(htmlContent); htmlView.ContentType = new System.Net.Mime.ContentType("text/html"); msg.AlternateViews.Add(htmlView); 

只是想添加一下,你可以使用定义的常量MediaTypeNames.Text.HtmlMediaTypeNames.Text.Plain而不是"text/html""text/plain" ,这总是一个更好的方法。 它在System.Net.Mime命名空间中。

所以在上面的例子中,这将是:

 AlternateView htmlView = AlternateView.CreateAlternateViewFromString(htmlContent, null, MediaTypeNames.Text.Html); 

我只是要在这里给任何有问题的人发一张便条,并find他们的方式到这个页面 – 有时,Outlook SMTP服务器将重新转换传出的电子邮件。 如果您看到您的纯文本主体完全消失,除了base64编码的附件,可能是因为您的服务器正在重新编码电子邮件。 谷歌的SMTP服务器不重新编码电子邮件 – 尝试通过那里发送,看看会发生什么。

在使用AlternateViews视图添加html和纯文本视图之前,请确保您没有设置邮件消息对象的正文

 // do not do this: var msg = new MailMessage(model.From, model.To); msg.Body = compiledHtml; 

因为这将使您的电子邮件在两个视图中都包含html内容,覆盖其他视图。

对于那些已经有gmail显示明文部分而不是html部分的人来说(像我一样)。

Gmail似乎总是在邮件中显示最后一部分。

因此,如果您在纯文本部分之前添加了html部分,gmail将始终显示纯文本变体。

要解决这个问题,你可以简单地在html部分之前添加纯文本部分。