我正在使用SmtpClient从我的C#应用程序发送邮件。工作得很好,但我必须决定是否要将邮件作为纯文本或HTML发送。我想知道,有没有办法送两个?我认为这叫做多部分。
我google了一下,但大多数示例基本上没有使用SmtpClient但是自己编写了整个SMTP-Body,这有点“可怕”,所以我想知道是否在.net Framework 3.0中构建了一些东西?
如果没有,是否有任何使用良好/强大的第三方库用于发送电子邮件?
答案 0 :(得分:58)
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);
答案 1 :(得分:44)
您要做的是使用MailMessage上的AlternateViews属性
http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.alternateviews.aspx
答案 2 :(得分:30)
只想添加您可以使用已定义的常量MediaTypeNames.Text.Html
和MediaTypeNames.Text.Plain
而不是"text/html"
和"text/plain"
,这始终是一种更好的方法。它在System.Net.Mime
命名空间中。
所以在上面的例子中,它将是:
AlternateView htmlView = AlternateView.CreateAlternateViewFromString(htmlContent, null, MediaTypeNames.Text.Html);
答案 3 :(得分:11)
我只是在这里给那些遇到问题的人发一张纸条并找到他们的方式进入这个页面 - 有时候,Outlook SMTP服务器会重新转发外发邮件。如果你看到你的纯文本主体完全消失,除了base64编码的附件,它可能是因为你的服务器正在重新编码电子邮件。谷歌的SMTP服务器不会重新编码电子邮件 - 尝试通过那里发送,看看会发生什么。
答案 4 :(得分:7)
除了使用AlternateViews视图添加html和纯文本视图之外,确保您还没有设置邮件消息的正文对象。
// do not do this:
var msg = new MailMessage(model.From, model.To);
msg.Body = compiledHtml;
因为它会使您的电子邮件在两个视图中都包含html内容,从而覆盖其他视图。
答案 5 :(得分:4)
对于那些有gmail显示明文部分而不是html部分的人(像我一样)。
Gmail似乎始终显示邮件的最后一部分。
因此,如果您在纯文本部分之前添加了html部分,则gmail将始终显示纯文本变体。
要解决此问题,您只需在html部分之前添加纯文本部分。