使用 EWS API 发送电子邮件时控制消息编码

Posted

技术标签:

【中文标题】使用 EWS API 发送电子邮件时控制消息编码【英文标题】:Control the Message encoding when sending email using EWS API 【发布时间】:2016-07-09 11:20:11 【问题描述】:

我正在使用 Microsoft EWS(Exchange 网络服务)向外部客户发送电子邮件(关于支持电话)。

我们的一个客户正在尝试将电子邮件正文自动导入他们自己的支持呼叫系统(我认为这是基于 JAVA),他们不断收到此异常:

不支持的编码异常:iso-8859-10

所以他们要求我将其更改为 UTF8

如果我从我的 Outlook(它是同一 Exchange 的客户端)向他们发送电子邮件,它工作正常。只有通过 EWS 发送时才会发生。

这是我的代码:

 protected void SendEmail2(string recipientsAddresses, string senderAddress, string ccRecipients, string subject, string body, bool CCToSender, bool simulate, Importance messageImportance)
    
        ExchangeService service = null;
        EmailMessage message = null;

        try
        
            // initialize a proxy to the exchange web services 
            service = new ExchangeService(MAGMA_EXCHAGE_VERSION);
            service.Url = new Uri(MAGMA_EWS_URI);

            // create the message
            message = new EmailMessage(service);

            // Add recipients
            foreach (string recipientEmail in recipientsAddresses.Split(";".ToCharArray()))
            
                message.ToRecipients.Add(new EmailAddress(recipientEmail));
            

            // handle inline images
            body = AddInlineImages(message, body);

            // set everything
            message.From = new EmailAddress(senderAddress);
            message.Subject = subject;
            message.Body = new MessageBody(BodyType.html, body);
            message.Importance = messageImportance;

            // and send
            message.Save();
            FolderId SentFolderForUser = new FolderId(WellKnownFolderName.SentItems, senderAddress);
            message.SendAndSaveCopy(SentFolderForUser);
        
        catch (Exception)
        
            throw;
        
    

我传递给“body”的字符串是一个 HTML,其中包含:

meta charset="utf-8" 标记在标题下。

这里有什么我遗漏的吗?

谢谢,吉尔。

【问题讨论】:

【参考方案1】:

您可能希望重新编码并使用类似下面的代码来设置编码:

$ews = new ExchangeWebServices($host, $user, $password, ExchangeWebServices::VERSION_2007_SP1);
$msg = new EWSType_MessageType();
$msg->MimeContent = new EWSType_MimeContentType();
$msg->MimeContent->_ = base64_encode("Mime-Version: 1.0\r\n"
    . "From: michael@contoso.com\r\n"
    . "To: amy@contoso.com\r\n"
    . "Subject: nothing\r\n"
    . "Date: Tue, 15 Feb 2011 22:06:21 -0000\r\n"
    . "Message-ID: <0>\r\n"
    . "X-Experimental: some value\r\n"
    . "\r\n"
    . "I have nothing further to say.\r\n");
$msg->MimeContent->CharacterSet = 'UTF-8';

另外看到这个question here,因为它看起来很相似。

注意:这是一个很好的starting point regarding the content-type encoding 选项。您还可能希望查看 Microsoft 官方指南 here。

【讨论】:

以上是关于使用 EWS API 发送电子邮件时控制消息编码的主要内容,如果未能解决你的问题,请参考以下文章

Outlook 365 EWS 流式通知 |如何计算发送和接收消息所需的时间?

如果地址是别名,如何使用 ews-java-api 识别收件人电子邮件?

使用 EWS for Exchange 2013 获取收件人电子邮件地址

C# Managed EWS 通过 ID 从共享邮箱获取电子邮件

EWS 中的扩展属性

EWS 托管 API 双跳