使用 MailKit 在 .net core 应用程序中发送带有 Html 模板的电子邮件

12
我正在使用MailKit从.NET Core应用程序发送电子邮件,并且它将成功发送。但是我想在.NET Core中使用HTML模板发送电子邮件。以下是当前使用静态正文部分发送电子邮件的代码。
 var emailMessage = new MimeMessage();
        if (!string.IsNullOrWhiteSpace(cc))
        {
            emailMessage.Cc.Add(new MailboxAddress(cc));
        }
        else if (!string.IsNullOrWhiteSpace(EmailUserNameCC))
        {
            emailMessage.Cc.Add(new MailboxAddress(EmailUserNameCC));
        }
        if (!string.IsNullOrWhiteSpace(EmailUserNameBCC))
        {
            emailMessage.Bcc.Add(new MailboxAddress(EmailUserNameBCC));
        }

        emailMessage.From.Add(new MailboxAddress(mailFrom));
        emailMessage.To.Add(new MailboxAddress(mailTo));
        emailMessage.Subject = subject;
        if (!string.IsNullOrWhiteSpace(replyTo))
        {
            emailMessage.InReplyTo = replyTo;
        }
        var builder = new BodyBuilder();// { TextBody = message };
        builder.HtmlBody = message;

        if (attachments != null && attachments.Count > 0)
        {
            foreach (var item in attachments)
            {
                builder.Attachments.Add(item.Key, item.Value);
            }

            builder.HtmlBody = builder.HtmlBody + " \n" + " PFA";

        }
        var multipart = new Multipart("mixed");
        multipart.Add(new TextPart("html") { Text = message });

        emailMessage.Body = builder.ToMessageBody();
        using (var client = new SmtpClient())
        {
            var credentials = new NetworkCredential
            {
                UserName = EmailUserName,
                Password = EmailPassword
            };

            if (!client.IsConnected)
            {
                client.Connect(SmtpHost, Convert.ToInt32(EmailHostPort));
                client.Authenticate(EmailUserName, EmailPassword);
            }
            client.MessageSent += c_EmailReached;

            client.Send(emailMessage);
        }

现在,我想使用HTML模板替换正文部分。 那么如何在.Net Core中使用MailKit与HTML模板?

另外:

-> 发送带有HTML模板的电子邮件后,实际电子邮件中不显示特殊字符。对于一些特殊字符,它会显示�。那么我该如何解决这个问题,以便也显示特殊字符。

谢谢。


你好,你在使用Azure吗?我在这篇文章中看到只能在Azure上使用SendGrid。你是如何克服这个问题的?https://stackoverflow.com/questions/42895082/asp-net-core-mailkit - Franva
1个回答

12
您可以使用 StreamReader 读取源文件,并将其分配给您的 builder.HtmlBody。
using (StreamReader SourceReader = System.IO.File.OpenText(path to your file))
{
   builder.HtmlBody = SourceReader.ReadToEnd();
}

我想从我的解决方案文件夹中读取HTML模板,并且还想将一些文本(如<<text1>>)替换为“MyFirstName”,将另一些文本(如<<text2>>)替换为“MyLastName”。 - Herin
1
以上的代码会帮助你。如果要替换文本,你可以使用 string.Format 函数。 - Rachit Tyagi
2
你也可以只使用 builder.HtmlBody = text.Replace("<<text2>>", "my text2 value"); - jstedfast
谢谢,它已经生效了,但是还有一个特殊字符显示的问题,我在“额外”部分编辑了我的问题。 - Herin
2
你可能需要对HTML中的特殊字符进行实体编码,或者如果它们在文本文件模板中,则需要确保您的StreamReader正在使用正确的System.Text.Encoding。 - jstedfast
显示剩余2条评论

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