Azure 函数发送的邮件编码错误

问题描述 投票:0回答:1

我创建了一个进程内 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 函数正确编码邮件消息?有什么地方可以设置吗

c# asp.net-core encoding azure-functions mailkit
1个回答
0
投票

您可以尝试修改您的CreateMessage方法以显式将字符编码设置为UTF-8。通过在 CreateMessage 方法中显式指定 UTF-8 编码,您可以确保电子邮件内容正确编码,无论 Azure Function 运行的环境如何。

mailKitMessage.Body = bodyBuilder.ToMessageBody(Encoding.UTF8);
© www.soinside.com 2019 - 2024. All rights reserved.