Office 365 Rest API SendMail 错误取决于文件附件扩展名
Office 365 Rest API SendMail errors depending on file attachment extension
我正在尝试即时发送带有附件的电子邮件,如下所述:https://msdn.microsoft.com/office/office365/APi/mail-rest-operations#SendMessageOnTheFly
使用这个 JSON 正文,我收到了来自服务器的 202 响应,并成功收到了一封附有文件的电子邮件。
Post to https://outlook.office.com/api/v2.0/me/sendmail:
{
Message: {
Subject: "...",
Body: {
ContentType: "HTML",
Content: "..."
},
ToRecipients: [
{
EmailAddress: {
Address: "..."
}
}
],
Attachments: [
{
"@odata.type": "#Microsoft.OutlookServices.FileAttachment",
Name: "test.txt",
ContentBytes: "bWFjIGFuZCBjaGVlc2UgdG9kYXk="
}
]
},
SaveToSentItems: true
}
但是,如果我将名称更改为 "test.msg",我会收到 500 内部服务器错误以及以下响应:
{
"error": {
"code": "ErrorInternalServerError",
"message": "Object reference not set to an instance of an object."
}
}
并且 "test.eml",我也收到 500 内部服务器错误,但响应不同:
{
"error": {
"code": "ErrorInternalServerError",
"message": "Unable to cast object of type 'Microsoft.Exchange.Services.Core.Types.ItemAttachmentType' to type 'Microsoft.Exchange.Services.Core.Types.FileAttachmentType'."
}
}
奇怪的是,对于这两种情况,我仍然收到电子邮件和附件。这令人沮丧,因为目前我的应用程序告诉用户发送电子邮件时发生了错误(基于 non-successful 状态代码)但电子邮件实际上已发送。
我知道消息和事件还有另一种 object 类型 (#Microsoft.OutlookServices.ItemAttachment),但我知道这意味着 outlook 服务器上已经存在的项目并通过 ID (例如为已经创建的活动附加会议邀请);另外,该类型没有 ContentBytes 作为我要填充的字段。对于即时发送,我认为任何二进制文件数据都将被相同对待(这些 .msg 和 .eml 文件是从用户的计算机上传的,不一定已经存在于 outlook 上)。
知道这里发生了什么吗?
更新
我测试了 creating a draft message, and adding the attachments in separate posts to the message, then sending。同样的错误信息。创建和发送导致成功的状态代码。如果扩展名为 .msg 或 .eml,创建附件将导致 500 Internal server errors。不过,实际发送的电子邮件将包含所有附件。
感谢您报告此事!在与我们的开发人员交谈后,我已将此作为 API 的错误提交。一旦我有了解决方案,我会更新这个答案,但我现在没有时间表可以分享。
UPDATE: This has been fixed. You'll now get a 202 Accepted
when you send an attached message. The fix went out some time ago, I've been lax in actually testing it and updating this post! :(
我正在尝试即时发送带有附件的电子邮件,如下所述:https://msdn.microsoft.com/office/office365/APi/mail-rest-operations#SendMessageOnTheFly
使用这个 JSON 正文,我收到了来自服务器的 202 响应,并成功收到了一封附有文件的电子邮件。
Post to https://outlook.office.com/api/v2.0/me/sendmail:
{
Message: {
Subject: "...",
Body: {
ContentType: "HTML",
Content: "..."
},
ToRecipients: [
{
EmailAddress: {
Address: "..."
}
}
],
Attachments: [
{
"@odata.type": "#Microsoft.OutlookServices.FileAttachment",
Name: "test.txt",
ContentBytes: "bWFjIGFuZCBjaGVlc2UgdG9kYXk="
}
]
},
SaveToSentItems: true
}
但是,如果我将名称更改为 "test.msg",我会收到 500 内部服务器错误以及以下响应:
{
"error": {
"code": "ErrorInternalServerError",
"message": "Object reference not set to an instance of an object."
}
}
并且 "test.eml",我也收到 500 内部服务器错误,但响应不同:
{
"error": {
"code": "ErrorInternalServerError",
"message": "Unable to cast object of type 'Microsoft.Exchange.Services.Core.Types.ItemAttachmentType' to type 'Microsoft.Exchange.Services.Core.Types.FileAttachmentType'."
}
}
奇怪的是,对于这两种情况,我仍然收到电子邮件和附件。这令人沮丧,因为目前我的应用程序告诉用户发送电子邮件时发生了错误(基于 non-successful 状态代码)但电子邮件实际上已发送。
我知道消息和事件还有另一种 object 类型 (#Microsoft.OutlookServices.ItemAttachment),但我知道这意味着 outlook 服务器上已经存在的项目并通过 ID (例如为已经创建的活动附加会议邀请);另外,该类型没有 ContentBytes 作为我要填充的字段。对于即时发送,我认为任何二进制文件数据都将被相同对待(这些 .msg 和 .eml 文件是从用户的计算机上传的,不一定已经存在于 outlook 上)。
知道这里发生了什么吗?
更新 我测试了 creating a draft message, and adding the attachments in separate posts to the message, then sending。同样的错误信息。创建和发送导致成功的状态代码。如果扩展名为 .msg 或 .eml,创建附件将导致 500 Internal server errors。不过,实际发送的电子邮件将包含所有附件。
感谢您报告此事!在与我们的开发人员交谈后,我已将此作为 API 的错误提交。一旦我有了解决方案,我会更新这个答案,但我现在没有时间表可以分享。
UPDATE: This has been fixed. You'll now get a
202 Accepted
when you send an attached message. The fix went out some time ago, I've been lax in actually testing it and updating this post! :(