使用SmtpClient通过C#发送HTML邮件

55

我该如何发送HTML邮件? 我使用这个答案中的代码使用SmtpClient发送邮件,但邮件始终是纯文本的,因此下面示例邮件中的链接未格式化。

<p>Welcome to SiteName. To activate your account, visit this URL: 
    <a href="http://SiteName.com/a?key=1234">http://SiteName.com/a?key=1234</a>.
</p>

我该如何在发送的电子邮件消息中启用HTML格式?


1
ropstah:说实话,我有点困惑,之前在你的评论中写道SmtpClient中没有IsBodyHtml属性。是Josiah告诉我应该使用MailMessage来完成它。 - user34537
6个回答

105

我的做法是:

MailMessage mail = new MailMessage(from, to, subject, message);
mail.IsBodyHtml = true;
SmtpClient client = new SmtpClient("localhost");
client.Send(mail);
请注意,我将邮件消息的 html 设置为 true:mail.IsBodyHtml = true;

10
需要注意的是,MailMessageSmtpClient都实现了IDisposable接口,因此需要适当地进行销毁处理。 - djs
我使用C# Windows表单以这种方式发送电子邮件。如何将图像嵌入电子邮件?`string body =“嗨,你好...<h1>测试标题</h1></br><h3>测试正文</h3><img src ='image.jpg' alt ='Image'>”;'我刚刚将我的图像添加到bin/debug文件夹中,但它没有起作用。 - JayNaz

22

我相信它应该是类似这样的:

mailObject.IsBodyHtml = true;

20

IsBodyHtml = true毫无疑问是最重要的部分。

但如果您想要发送既包含纯文本部分又包含作为备选项组成的HTML部分的电子邮件,可以使用AlternateView类:

MailMessage msg = new MailMessage();
AlternateView plainView = AlternateView
     .CreateAlternateViewFromString("Some plaintext", Encoding.UTF8, "text/plain");
// We have something to show in real old mail clients.
msg.AlternateViews.Add(plainView); 
string htmlText = "The <b>fancy</b> part.";
AlternateView htmlView = 
     AlternateView.CreateAlternateViewFromString(htmlText, Encoding.UTF8, "text/html");
msg.AlternateViews.Add(htmlView); // And a html attachment to make sure.
msg.Body = htmlText;  // But the basis is the html body
msg.IsBodyHtml = true; // But the basis is the html body

AlternateView 对于 htmlView 真的必要吗?因为您已经将正文设置为 htmlText。再次将其设置为备用视图是否多余? - Rosdi Kasim
2
不仅是必要的,而且重要的是,在纯文本备用视图之后添加它。请参见https://dev59.com/pm435IYBdhLWcg3w1juV。 但是,如果您已经添加了HTML备用视图,则不需要指定Body和IsBodyHtml。 - FunkyOne

8

应用正确的编码方式对邮件正文进行编码。

mail.IsBodyHtml = true;

0
我有一个想法,你可以在你的项目中添加一个复选框,作为用户发送电子邮件的HTML选项,并添加以下代码以启用它:
         MailMessage mail = new MailMessage(from, to, subject, message);

         if(checkBox1.CheckState == CheckState.Checked )
           {
               mail.IsBodyHtml = true;
           }

         SmtpClient client = new SmtpClient("localhost");

         client.Send(mail);

-1
如果你正在使用 Mailkit,我们可以使用 TextBody、HtmlBody 和 Both 三个参数来设置消息体。只需编写以下代码即可:
            MimeMessage mailMessage = new MimeMessage();
            mailMessage.From.Add(new MailboxAddress(senderName, sender@address.com));
            mailMessage.Sender = new MailboxAddress(senderName, sender@address.com);
            mailMessage.To.Add(new MailboxAddress(emailid, emailid));
            mailMessage.Subject = subject;
            mailMessage.ReplyTo.Add(new MailboxAddress(replyToAddress));
            mailMessage.Subject = subject;
            var builder = new BodyBuilder();
            builder.HtmlBody = "Hello There";
            mailMessage.Body = builder.ToMessageBody();            
            try
            {
                using (var smtpClient = new SmtpClient())
                {
                    smtpClient.Connect("HostName", "Port", MailKit.Security.SecureSocketOptions.None);
                    smtpClient.Authenticate("user@name.com", "password");

                    smtpClient.Send(mailMessage);
                    Console.WriteLine("Success");
                }
            }
            catch (SmtpCommandException ex)
            {
                Console.WriteLine(ex.ToString());              
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());                
            }

该构造器在此上下文中未被使用。 - Basit Anwer
使用BodyBuilder必须安装MimeKit。 - Naveen
不,我的意思是在 builder.HtmlBody = "Hello There"; 之后,根本没有使用 builder 变量。 - Basit Anwer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接