Отправить электронную почту в формате HTML через С# с помощью SmtpClient

Как отправить электронное письмо в формате 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 в сообщениях электронной почты, которые я отправляю?


person Community    schedule 25.08.2009    source источник
comment
ropstah: TBH я запутался и написал в одном из ваших комментариев, что в SmtpClient нет IsBodyHtml. Иосия показал мне, как это сделать с помощью MailMessage.   -  person    schedule 26.08.2009


Ответы (6)


Вот что я делаю:

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

Обратите внимание, что я установил для HTML почтового сообщения значение true: mail.IsBodyHtml = true;

person Josiah Peters    schedule 25.08.2009
comment
Стоит отметить, что и MailMessage, и SmtpClient реализуют IDisposable и должны быть соответствующим образом утилизированы. - person djs; 23.02.2017
comment
Я использую форму окна С# для отправки электронной почты таким образом. Как вставить изображение в письмо? `string body = Привет... ‹h1› Заголовок теста ‹/h1› ‹/br› ‹h3› тело теста ‹/h3› ‹img src='image.jpg' alt='Image'›;' Я только что добавил свое изображение в папку bin/debug. Но это не работает. - person JayNaz; 08.12.2018

Я считаю, что это было что-то вроде:

mailObject.IsBodyHtml = true;
person Ropstah    schedule 25.08.2009
comment
ropstah: TBH я запутался и написал в одном из двух комментариев, что в SmtpClient нет IsBodyHtml. Иосия показал мне, как это сделать с помощью MailMessage. - person ; 26.08.2009

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
person faester    schedule 10.12.2014
comment
Действительно ли необходимо AlternateView для htmlView? Поскольку вы уже установили тело как htmlText. Разве не избыточно снова устанавливать его как альтернативный вид? - person Rosdi Kasim; 22.01.2016
comment
Не только необходимо, но и важно, чтобы он был добавлен после простого альтернативного вида. см. stackoverflow.com/questions/ 5188605/. Но указывать Body и IsBodyHtml не обязательно, если вы добавили альтернативный вид html. - person FunkyOne; 22.09.2016

Примените правильную кодировку Mailbody.

mail.IsBodyHtml = true;
person Bdiem    schedule 25.08.2009

У меня есть идея, вы можете добавить в свой проект флажок для отправки электронной почты в формате 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);
person nassimlouchani    schedule 11.03.2014

Если вы используете Mailkit, мы можем использовать TextBody, HtmlBody и Both для тела сообщения. Просто напишите этот код. Это поможет вам

            MimeMessage mailMessage = new MimeMessage();
            mailMessage.From.Add(new MailboxAddress(senderName, [email protected]));
            mailMessage.Sender = new MailboxAddress(senderName, [email protected]);
            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("[email protected]", "password");

                    smtpClient.Send(mailMessage);
                    Console.WriteLine("Success");
                }
            }
            catch (SmtpCommandException ex)
            {
                Console.WriteLine(ex.ToString());              
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());                
            }
person Naveen    schedule 09.08.2018
comment
Строитель не используется в этом контексте - person Basit Anwer; 04.01.2020
comment
Для BodyBuilder у вас должен быть MimeKit. - person Naveen; 08.01.2020
comment
Нет, я имел в виду, что после builder.HtmlBody = "Hello There"; переменная builder вообще не используется. - person Basit Anwer; 16.01.2020