我正在使用SmtpClient从我的C#应用程序发送邮件.工作得很好,但我必须决定是否要将邮件作为纯文本或HTML发送.我想知道,有没有办法送两个?我认为这叫做多部分.
我用Google搜索了一下,但是大多数示例基本上没有使用SmtpClient,而是整个SMTP-Body本身,这有点"可怕",所以我想知道是否在.net Framework 3.0中构建了一些东西?
如果没有,是否有任何使用良好/强大的第三方库用于发送电子邮件?
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);
您要做的是使用MailMessage上的AlternateViews属性
http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.alternateviews.aspx
只是想补充一点,你可以使用定义的常量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服务器不会重新编码电子邮件 - 尝试通过那里发送,看看会发生什么.
除了使用AlternateViews视图添加html和纯文本视图之外,请确保您还没有设置Mail Message对象的主体.
// do not do this: var msg = new MailMessage(model.From, model.To); msg.Body = compiledHtml;
因为它会使您的电子邮件在两个视图中都包含html内容,从而覆盖其他视图.
对于像我这样的人,他们在gmail中显示纯文本部分而不是html部分。
Gmail似乎总是显示邮件的最后一部分。
因此,如果您在纯文本部分之前添加了html部分,那么gmail总是会显示纯文本变体。
要解决此问题,您只需在html部分之前添加纯文本部分。