我创建了一个进程内 Azure 函数(使用 .Net 6 的 v4),用于发送一堆电子邮件。
我正在使用中间件服务发送使用 MailKit 3.1.0 的邮件
我首先创建一个简单的 mimeKit 消息(其中 messageBody 是基本的 HTML 代码
<p>Åäö</p>
)
public MimeKit.MimeMessage CreateMessage(bool htmlBody = true, string messageBody, string
messageSubject, List<string> mailRecipients, string mailSender)
{
var mailKitMessage = new MimeKit.MimeMessage();
mailKitMessage.From.Add(MimeKit.InternetAddress.Parse(mailSender));
mailKitMessage.To.AddRange(mailRecipients.Select(address => MimeKit.InternetAddress.Parse(address)));
mailKitMessage.Subject = messageSubject;
var bodyBuilder = new MimeKit.BodyBuilder();
if (htmlBody)
{
bodyBuilder.HtmlBody = $"<div style=\"font-family: helvetica; font-size: 10px;\">{messageBody}</div>";
}
else
{
bodyBuilder.TextBody = messageBody;
}
mailKitMessage.Body = bodyBuilder.ToMessageBody();
return mailKitMessage;
}
然后调用以下MailKit。
public async Task SendAsync(MimeKit.MimeMessage message)
{
using (var smtpClient = new MailKit.Net.Smtp.SmtpClient())
{
await smtpClient.ConnectAsync(this.SmtpHost, this.PortNumber, MailKit.Security.SecureSocketOptions.StartTls).ConfigureAwait(false);
await smtpClient.AuthenticateAsync(this.GetDomainSpecificMailjetCredentials(message.Sender)).ConfigureAwait(false);
await smtpClient.SendAsync(message).ConfigureAwait(false);
await smtpClient.DisconnectAsync(true).ConfigureAwait(false);
}
}
通过虚拟机或本地运行内容时,这非常有用,但是当我将其上传到 Azure 时,所有斯堪的纳维亚特殊字符(“Å”、“ä”、“Ö”、“Ø”)都会变成 ���。 我知道当您的应用程序使用 latin1 但试图将其显示为 UTF-8 时,就会发生这种情况。所以我尝试通过重载来解决这个问题:
smtpClient.AuthenticateAsync(this.GetDomainSpecificMailjetCredentials(message.Sender));
到
smtpClient.AuthenticateAsync(Encoding.Default, this.GetDomainSpecificMailjetCredentials(message.Sender));
希望它停止尝试转换它,但这没有用。
所以我的第一个问题是,当正常的应用程序服务/本地开发使用相同的代码正常工作时,为什么我的 Azure 函数发送编码为 Latin1 的电子邮件,第二个问题是如何强制我的 Azure 函数正确编码邮件消息?有什么地方可以设置吗
您可以尝试修改您的CreateMessage方法以显式将字符编码设置为UTF-8。通过在 CreateMessage 方法中显式指定 UTF-8 编码,您可以确保电子邮件内容正确编码,无论 Azure Function 运行的环境如何。
mailKitMessage.Body = bodyBuilder.ToMessageBody(Encoding.UTF8);