Office365 执行多个请求时出现“addFileAttachmentAsync”错误
Office365 “addFileAttachmentAsync” error when doing multiple requests
我在使用 addFileAttachmentAsync 时遇到问题。我有 2 个数组:embeddedFiles(包含将附加到正文中的文件名)和 attachments(包含将作为附件的文件名)。我有 2 for 循环 运行 每个数组,他们应该对数组中的每个文件发出 GET 请求到 Exchange Server 和取回二进制文件。
for (var i = 0; i < embeddedFiles.length; i++) {
var attachmentName = (new Date()).getTime() + ".png";
var count = 0;
var options = { isInline: true, ContentId: attachmentName, asyncContext: { UniqueName: attachmentName } };
var attachmentURL = "http://" + document.location.hostname + document.location.port + '/MailForms/api/GetAttachment?' + 'AttId=' + embeddedFiles[i] + '&' + 'MwToken=' + token + '&' + 'ReqId=' + data.ReqId + '&' + 'userSmtp=' + smtp;
Office.context.mailbox.item.addFileAttachmentAsync(
attachmentURL,
attachmentName,
options,
function (asyncResult) {
if (asyncResult.status == Office.AsyncResultStatus.Failed) {
app.showNotification('Failed to add attachment', asyncResult.error.message);
}
else {
var szCID = asyncResult.asyncContext.UniqueName;
//var szAddBodyData = "<br><div><img height=150 width=150 src='cid:" + szCID + "'></div><br>"
var bizimCigid = "cid:" + szCID;
var index = "" + count;
var oldsource = oBody.find('.mw-images')[index].attributes[1].value;
oldsource = bizimCigid;
//imagesource.replaceWith(bizimCigid);
//Office.context.mailbox.item.body.setSelectedDataAsync(szAddBodyData, { coercionType: Office.CoercionType.Html });
oBody.find('.mw-images')[index].attributes[1].value = oldsource;
//Office.context.mailbox.item.body.setSelectedDataAsync({ coercionType: Office.CoercionType.Html });
viewModel.updateComposeFormLast(subject, oBody["0"].innerHTML);
count = count + 1;
}
}
);
for (var i = 0; i < attachments.length; i++) {
var attachmentURL = "http://" + document.location.hostname + document.location.port + '/MailForms/api/GetAttachment?' + 'AttId=' + attachments[i] + '&' + 'MwToken=' + token + '&' + 'ReqId=' + data.ReqId + '&' + 'userSmtp=' + smtp;
Office.context.mailbox.item.addFileAttachmentAsync(
attachmentURL,
attachments[i],
{
'asyncContext': {}
},
viewModel.getAttachmentsContent
);
}
上面的代码获取查询字符串并调用 addFileAttachmentAsync 方法。 URL没有错。我在浏览器上试过它们,它们确实根据自定义 URL 获得了实际文件。 getAttachmentsContent 是一个只调用 console.log("blah") 的方法。
添加单个附件或内联图像时效果很好。但是我需要添加多个附件和多个嵌入图像。以下是我尝试过的事情:
- 只需添加一个附件 - 有效
- 只需添加一个内联图像 - 有效
- 添加图像和附件 - 有效,但速度较慢
- 多个附件和内联图像 - 不起作用。
我遇到的错误:
error OSF.DDA.Error code 9002 message "There was an internal format error." name : "InternalFormatError"*
对我来说,当您执行多个相同格式的请求时,它似乎会中断。但我不确定为什么。
有什么想法吗?
@Namig Ismayilov,addFileAttachmentAsync
方法是异步的。
因此,要调用多个异步调用,您可以选择以下选项:
- 使用
Promises
: (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
- 通过在前一个异步方法的回调中调用下一个异步方法来使用嵌套函数调用。
- 使用递归,嵌套调用。这只是上面第 2 点的扩展。
例如,对于您的情况,这是一种使用递归附加多个文件的方法。调用者应该只调用方法 my_add_file_attachments_recursively()
function my_add_file_attachments_recursively_helper(file_attachment_arr, index, message)
{
if (index < file_attachment_arr.length)
{
var file_attachment_obj = file_attachment_arr[index];
Office.context.mailbox.item.addFileAttachmentAsync
(
file_attachment_obj.url,
file_attachment_obj.name,
{
"asyncContext" :
{
"message" : message,
"index" : index
}
},
function (asyncResult)
{
var next_message = asyncResult.asyncContext.message + "id : " + asyncResult.value + " , " + "status : " + asyncResult.status + "\n";
// add the next attachment here, recursively
my_add_file_attachments_recursively_helper(file_attachment_arr, asyncResult.asyncContext.index + 1, next_message);
}
);
}
else
{
console.log(message);
}
}
function my_add_file_attachments_recursively()
{
var file_attachments_arr =
[
{
"name" : "gold_puppy.jpg",
"url" : "https://foo/gold_puppy.jpg"
},
{
"name" : "black_puppy.jpg",
"url" : "https://foo/black_puppy.jpg"
},
{
"name" : "white_puppy.jpg",
"url" : "https://foo/white_puppy.jpg"
}
];
my_add_file_attachments_recursively_helper(file_attachments_arr, 0, "");
}
我在使用 addFileAttachmentAsync 时遇到问题。我有 2 个数组:embeddedFiles(包含将附加到正文中的文件名)和 attachments(包含将作为附件的文件名)。我有 2 for 循环 运行 每个数组,他们应该对数组中的每个文件发出 GET 请求到 Exchange Server 和取回二进制文件。
for (var i = 0; i < embeddedFiles.length; i++) {
var attachmentName = (new Date()).getTime() + ".png";
var count = 0;
var options = { isInline: true, ContentId: attachmentName, asyncContext: { UniqueName: attachmentName } };
var attachmentURL = "http://" + document.location.hostname + document.location.port + '/MailForms/api/GetAttachment?' + 'AttId=' + embeddedFiles[i] + '&' + 'MwToken=' + token + '&' + 'ReqId=' + data.ReqId + '&' + 'userSmtp=' + smtp;
Office.context.mailbox.item.addFileAttachmentAsync(
attachmentURL,
attachmentName,
options,
function (asyncResult) {
if (asyncResult.status == Office.AsyncResultStatus.Failed) {
app.showNotification('Failed to add attachment', asyncResult.error.message);
}
else {
var szCID = asyncResult.asyncContext.UniqueName;
//var szAddBodyData = "<br><div><img height=150 width=150 src='cid:" + szCID + "'></div><br>"
var bizimCigid = "cid:" + szCID;
var index = "" + count;
var oldsource = oBody.find('.mw-images')[index].attributes[1].value;
oldsource = bizimCigid;
//imagesource.replaceWith(bizimCigid);
//Office.context.mailbox.item.body.setSelectedDataAsync(szAddBodyData, { coercionType: Office.CoercionType.Html });
oBody.find('.mw-images')[index].attributes[1].value = oldsource;
//Office.context.mailbox.item.body.setSelectedDataAsync({ coercionType: Office.CoercionType.Html });
viewModel.updateComposeFormLast(subject, oBody["0"].innerHTML);
count = count + 1;
}
}
);
for (var i = 0; i < attachments.length; i++) {
var attachmentURL = "http://" + document.location.hostname + document.location.port + '/MailForms/api/GetAttachment?' + 'AttId=' + attachments[i] + '&' + 'MwToken=' + token + '&' + 'ReqId=' + data.ReqId + '&' + 'userSmtp=' + smtp;
Office.context.mailbox.item.addFileAttachmentAsync(
attachmentURL,
attachments[i],
{
'asyncContext': {}
},
viewModel.getAttachmentsContent
);
}
上面的代码获取查询字符串并调用 addFileAttachmentAsync 方法。 URL没有错。我在浏览器上试过它们,它们确实根据自定义 URL 获得了实际文件。 getAttachmentsContent 是一个只调用 console.log("blah") 的方法。
添加单个附件或内联图像时效果很好。但是我需要添加多个附件和多个嵌入图像。以下是我尝试过的事情:
- 只需添加一个附件 - 有效
- 只需添加一个内联图像 - 有效
- 添加图像和附件 - 有效,但速度较慢
- 多个附件和内联图像 - 不起作用。
我遇到的错误:
error OSF.DDA.Error code 9002 message "There was an internal format error." name : "InternalFormatError"*
对我来说,当您执行多个相同格式的请求时,它似乎会中断。但我不确定为什么。
有什么想法吗?
@Namig Ismayilov,addFileAttachmentAsync
方法是异步的。
因此,要调用多个异步调用,您可以选择以下选项:
- 使用
Promises
: (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) - 通过在前一个异步方法的回调中调用下一个异步方法来使用嵌套函数调用。
- 使用递归,嵌套调用。这只是上面第 2 点的扩展。
例如,对于您的情况,这是一种使用递归附加多个文件的方法。调用者应该只调用方法 my_add_file_attachments_recursively()
function my_add_file_attachments_recursively_helper(file_attachment_arr, index, message)
{
if (index < file_attachment_arr.length)
{
var file_attachment_obj = file_attachment_arr[index];
Office.context.mailbox.item.addFileAttachmentAsync
(
file_attachment_obj.url,
file_attachment_obj.name,
{
"asyncContext" :
{
"message" : message,
"index" : index
}
},
function (asyncResult)
{
var next_message = asyncResult.asyncContext.message + "id : " + asyncResult.value + " , " + "status : " + asyncResult.status + "\n";
// add the next attachment here, recursively
my_add_file_attachments_recursively_helper(file_attachment_arr, asyncResult.asyncContext.index + 1, next_message);
}
);
}
else
{
console.log(message);
}
}
function my_add_file_attachments_recursively()
{
var file_attachments_arr =
[
{
"name" : "gold_puppy.jpg",
"url" : "https://foo/gold_puppy.jpg"
},
{
"name" : "black_puppy.jpg",
"url" : "https://foo/black_puppy.jpg"
},
{
"name" : "white_puppy.jpg",
"url" : "https://foo/white_puppy.jpg"
}
];
my_add_file_attachments_recursively_helper(file_attachments_arr, 0, "");
}