Надстройка Outlook - AttachmentId имеет неправильный формат - PullRequest
0 голосов
/ 17 июня 2020

У нас периодически возникали проблемы, из-за которых мы получали сообщение об ошибке при загрузке содержимого элемента электронной почты из EWS «AttachmentId is malformed». Это для ItemAttachment (особенно файлов .eml)

Мы не могли понять, почему и как это происходит, и заметили, что те, которые не работали, имели + и / в идентификаторах. Поиск в Интернете дал мне эту статью . Хотя эта статья написана в 2015 году, мне интересно, происходит ли это до сих пор.

Эта статья взорвала мой разум и имела смысл (отчасти) и реализовала преобразование + -> _ и / - > - некоторое время работал нормально.

Теперь мы получаем ту же ошибку «AttachmentId is malformed» и снова не можем найти причину, я удалил пользовательскую функцию дезинфекции, которая заменяет эти символы, и она начала работать снова.

Понятия не имею, что и почему это происходит и как надежно получить содержимое вложений. В настоящее время я переместил дезинфицирующее средство в обработчик catch, поэтому, если по какой-либо причине AttachmentId не работает, мы попытаемся повторить его, дезинфицируя его. Придется следить за тем, сколько из них вышло из строя.

Мы будем очень благодарны за любой свет по этой проблеме.

Обновление 1.0 - Пример кода

Внешний интерфейс

//At this point we've got the email and got the files
//We call EWS only if file.type == Office.MailboxEnums.AttachmentType.Item
//For all other files we call REST endpoint ~ Office.context.mailbox.restUrl + '/v2.0/'......
//Sample code below if only for EWS call

let files = this.email.attachments || [];

files.map(file => {
  this._getEmailContent(file)
  .then(res => {
    return res;
  });
})

//Get content from EWS
_getEmailContent(file, _failed){

  //attachmentId
  //Most of the times this will be fine, but at times when Id has a `+` or `/` if fails, Was expecting the convertToEwsId to handle any sanitization required.

  let attachmentId = Office.context.mailbox.convertToEwsId(file.id, Office.MailboxEnums.RestVersion.v2_0);
 
  return this.getToken(EWS)
  .then(token => {
    return this.http.post(`${endpoint}/downloadAttachment`,{
      token: token,
      url: Office.context.mailbox.ewsUrl,
      id: attachmentId
    },{
       responseType: 'arraybuffer',
    }).then(res => res.data);
  }).catch(err => {
     attachmentId = attachmentId.replace(/\+/g, "_");
     this._getEmailContent(attachmentId, true);
  })
}

Серверная

[HttpPost]
public DownloadAttachment(Request model){

 var data = service.DownloadAttachment(model);

 if(data == null)
 {
  return BadRequest("Error downloading content...");
 }
 
 return new HttpResponseMessage(HttpStatusCode.OK)
 {
   return data;
 }

}

//Inside service
public byte[] DownloadAttachment(Request request){
  var ser = new ExchangeService
  {
    Credentials: request.token,
    Url = request.url
  }

  //Here it fails intermittently, returning AttachmentId is malformed.
  var attachment = ser.GetAttachments(new [] {request.attachmentId}, null, null).First();
  
  if (attachment is FileAttachment)
  {
     FileAttachment fileAttachment = attachment as FileAttachment;
     fileAttachment.Load();
     return fileAttachment.Content; 
  }
   
}
...