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

Posted

技术标签:

【中文标题】使用 SmtpClient 通过 C# 发送 HTML 电子邮件【英文标题】:Send HTML email via C# with SmtpClient 【发布时间】:2010-11-22 17:30:10 【问题描述】:

如何发送 html 电子邮件?我使用this answer 中的代码以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?

【问题讨论】:

ropstah: TBH 我很困惑,并在您的一个 cmets 中写道,SmtpClient 中没有 IsBodyHtml。 Josiah 是让我使用 MailMessage 做到这一点的人。 【参考方案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());                
            

【讨论】:

此上下文中未使用构建器 对于 BodyBuilder,你必须有 MimeKit。 不,我的意思是在builder.HtmlBody = "Hello There"; builder 变量之后根本没有使用。【参考方案2】:

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

但是,如果您想提供一封同时包含 text/plain 部分和 text/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

【讨论】:

AlternateViewhtmlView 真的有必要吗?因为您已经将正文设置为htmlText。再次设置为备用视图不是多余的吗? 不仅是必要的,而且重要的是它被添加在普通的替代视图之后。见***.com/questions/5188605/…。但是如果您添加了 html 替代视图,则不需要指定 Body 和 IsBodyHtml。【参考方案3】:

我有一个想法,您可以在项目中添加一个复选框,以将电子邮件作为 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);

【讨论】:

【参考方案4】:

这就是我的工作:

MailMessage mail = new MailMessage(from, to, subject, message);
mail.IsBodyHtml = true;
SmtpClient client = new SmtpClient("localhost");
client.Send(mail);

请注意,我将邮件消息 html 设置为 true:mail.IsBodyHtml = true;

【讨论】:

值得注意的是MailMessageSmtpClient都实现了IDisposable,需要相应地处理。 我使用 C# windows form 以这种方式发送电子邮件。如何在电子邮件中嵌入图像? `string body = "你好...

测试标题

测试正文

";'我刚刚将我的图像添加到 bin/debug 文件夹中。但它不起作用。
【参考方案5】:

我相信是这样的:

mailObject.IsBodyHtml = true;

【讨论】:

ropstah: TBH 我很困惑,并在两个 cmets 之一中写道,SmtpClient 中没有 IsBodyHtml。 Josiah 是让我使用 MailMessage 做到这一点的人。【参考方案6】:

应用正确的 Mailbody 编码。

mail.IsBodyHtml = true;

【讨论】:

以上是关于使用 SmtpClient 通过 C# 发送 HTML 电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

C# 使用 SmtpClient 发送带有内联图像的邮件

c# SmtpClient 类无法使用 gmail 发送电子邮件

使用 SmtpClient 发送邮件时图像中断

c# 资源中的 SmtpClient 由于其保护级别而无法访问

发送匿名电子邮件 C#

smtpclient.send 在尝试通过 Office 365 发送电子邮件时挂起