2008-09-04 73 views
48

我使用SmtpClient从我的C#应用​​程序发送邮件。很好用,但我必须决定是否要以纯文本或HTML格式发送邮件。我想知道,是否有两种方法可以发送?我认为这就是所谓的多部分。在.net中以HTML和纯文本格式发送邮件

我用google搜索了一下,但是大多数例子本质上并没有使用SmtpClient,而是组成了整个SMTP-Body本身,这有点“可怕”,所以我想知道.net Framework 3.0中是否构建了一些东西?

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

回答

53

MSDN文档看起来虽然错过一两件事,我必须设置内容手动键入,但除此之外,它的工作原理就像一个魅力:-)

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); 
+0

+1由于这对我有用,因此取消了投票表决。 – plntxt 2009-07-27 19:29:10

+3

它看起来像MSDN文档已更新:他们的示例代码的C#版本使用AlternateView.CreateAlternateViewFromString版本,将内容类型作为参数。 C++版本没有(他们可能忽略更新它)。 – Babak 2013-09-19 15:16:29

+2

@jep我能够通过使用msg.BodyEncoding = Encoding.ASCII来防止我的smtp服务器(类似于Exchange)将纯文本版本重新编码为BASE64。 htmlView没有受到伤害。 – secretwep 2014-08-21 17:49:59

26

只是想补充一点,你可以用定义的常量MediaTypeNames.Text.HtmlMediaTypeNames.Text.Plain代替"text/html""text/plain",这总是一个更好的方法。它位于System.Net.Mime命名空间中。

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

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

我只是打算把这里记下这是使用问题,并找到自己的方式这个页面的人 - 有时,展望SMTP服务器将重新转换传出的电子邮如果你看到你的纯文本主体完全消失,除了base64编码的附件,这可能是因为你的服务器正在重新编码电子邮件。谷歌的SMTP服务器不会重新编码电子邮件 - 尝试通过那里发送,看看会发生什么。

6

除了使用AlternateViews视图添加html和纯文本视图之外,还要确保您没有设置邮件消息对象的正文。

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

因为它会让您的电子邮件包含两个视图中的html内容,覆盖其他视图。

4

对于已经有gmail显示明文部分而不是html部分的问题的人(例如我)

Gmail似乎总是在消息中显示最后一部分。

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

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

相关问题