C# 在.net中以HTML和纯文本形式发送邮件

C# 在.net中以HTML和纯文本形式发送邮件,c#,.net,C#,.net,我正在使用SmtpClient从我的C#应用程序发送邮件。很好,但我必须决定是以纯文本还是HTML格式发送邮件。我想知道,有没有办法把两者都送去?我想这叫做多部分 我在谷歌上搜索了一下,但大多数示例基本上没有使用SmtpClient,而是由整个SMTP正文组成,这有点“吓人”,所以我想知道.NETFramework3.0中是否构建了一些东西 如果没有,是否有任何真正使用良好/功能强大的第三方库用于发送电子邮件?您要做的是在MailMessage上使用AlternateViews属性 尽管MSDN

我正在使用SmtpClient从我的C#应用程序发送邮件。很好,但我必须决定是以纯文本还是HTML格式发送邮件。我想知道,有没有办法把两者都送去?我想这叫做多部分

我在谷歌上搜索了一下,但大多数示例基本上没有使用SmtpClient,而是由整个SMTP正文组成,这有点“吓人”,所以我想知道.NETFramework3.0中是否构建了一些东西


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

您要做的是在MailMessage上使用AlternateViews属性


尽管MSDN文档似乎遗漏了一件事,我必须手动设置内容类型,但除此之外,它就像一个符咒一样工作:-)


只想补充一点,您可以使用已定义的常量
MediaTypeNames.Text.Html
MediaTypeNames.Text.Plain
,而不是
“Text/Html”
“Text/Plain”
,这始终是一种更可取的方法。它位于
System.Net.Mime
命名空间中

因此,在上面的示例中,它将是:

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

我只是想在这里为任何有问题的人写一个便条,他们找到了进入这个页面的方法——有时候,Outlook SMTP服务器会重新转换发送的电子邮件。如果您看到您的纯文本正文完全消失,并且只有base64编码的附件,这可能是因为您的服务器正在重新编码电子邮件。谷歌的SMTP服务器不会重新编码电子邮件-尝试通过那里发送邮件,看看会发生什么。

在使用AlternateView视图添加html和纯文本视图的基础上,确保您没有设置邮件的正文

// do not do this: 
var msg = new MailMessage(model.From, model.To);
msg.Body = compiledHtml;  
因为这将使您的电子邮件在两个视图中都包含html内容,从而覆盖其他视图。

对于gmail显示纯文本部分而不是html部分有问题的人(如我)

Gmail似乎总是显示邮件的最后一部分

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


要解决这个问题,您只需在html部分之前添加纯文本部分。

+1取消了否决投票,因为这对我很有用。看起来MSDN文档已经更新:他们示例代码的C#版本使用了AlternateView.CreateAlternateViewFromString版本,该版本将内容类型作为参数。C++版本不(他们可能忽略了它)。@ JEP,我可以防止我的SMTP服务器(一个类似于Exchange)通过使用MS.ByDyCyto= EncId.asCII将纯文本版本重新编码为Base64。htmlView没有损坏。因此我应该在构造函数中传递电子邮件的文本版本。?我更喜欢:var htmlView=AlternateView.CreateAlternateViewFromString(htmlContent,new ContentType(MediaTypeNames.Text.Html));我确实找到了我的方式(四年后)来寻找这个。您或任何阅读此文章的人是否知道如何在Microsoft Exchange Server 2010 SP3上阻止它?SmtpDeliveryMethod.SpecifiedPickupDirectory是您的朋友,您可以准确了解发送到传出SMTP客户端的内容。允许您保存由.NET SmtpClient发送的原始电子邮件(用记事本打开)的副本。
// do not do this: 
var msg = new MailMessage(model.From, model.To);
msg.Body = compiledHtml;