Как сделать outlook почтовое вложение из памяти? - PullRequest
0 голосов
/ 14 февраля 2019

Добавление нового System.Net.Mail.Attachment в Outlook.MailItem.Attachments через Attachments.Add() приводит к System.ArgumentException: 'Sorry, something went wrong. You may want to try again.'

Попытка добавить изображение JPEG, закодированное в Base64, в качестве вложения в почтовый элемент в Outlook.Я храню закодированное изображение как переменную, преобразуя его в поток памяти, а затем во вложение.

public void CreateMessageWithAttachment() {
    Outlook.MailItem mailIttem = thisAddIn.Application.CreateItem(Outlook.OlItemType.olMailItem);
    string base64Attachment = "/...base64 gibberish";
    MemoryStream ms = new MemoryStream(Convert.FromBase64String(base64Attachment));
    ContentType ct = new ContentType(MediaTypeNames.Image.Jpeg);
    Attachment attachment = new Attachment(ms, ct);

    attachment.ContentDisposition.FileName = "look_at_dis.jpg";
    mailIttem.Subject = "Test e-mail message with attachment";
    mailIttem.To = "friend@company.com";
    mailIttem.Body = "This message has been generated programmatically";
    mailIttem.Attachments.Add(attachment); // This raises "Sorry..." expression
    mailIttem.Display(true);
}

Повышает System.ArgumentException: 'Sorry, something went wrong. You may want to try again.', что мне ничего не говорит: - /

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Официальные документы дали мне впечатление, что Attachments.Add должен действительно работать только с путями к файлам, поэтому сохранение MemoryStream во временный файл и его присоединение решило проблему.

string tempFilePath = Path.GetTempPath() + "look_at_dis.jpg";
FileStream fs = new FileStream(tempFilePath, FileMode.Create);

ms.CopyTo(fs);
fs.Close();

mailIttem.Attachments.Add(tempFilePath, Outlook.OlAttachmentType.olByValue, 1, "look_at_dis.jpg");
0 голосов
/ 14 февраля 2019

MailItem.Attachments.Add позволяет передавать в качестве параметра только строку (полный путь к файлу) или другой элемент Outlook (например, MailItem).

На уровне расширенного MAPI (C ++ или Delphi)только), он принимает только IStream (вы должны открыть PR_ATTACH_DATA_BIN как IStream, используя IAttach::OpenProperty).Если опция Redemption (я ее автор) является опцией, она позволяет передавать URL, имя файла, другой элемент Outlook, IStream или IStorage COM-интерфейс, другое вложение (Outlook.Attachmentили Redemption.RDOAttachment или IAttach интерфейс MAPI) или массив (Variant или byte) для RDOMail . Вложения . Add

0 голосов
/ 14 февраля 2019

Прежде чем прикрепить поток памяти к сообщению, я считаю, что вы должны сбросить его позицию на ноль:

MemoryStream ms = new MemoryStream(Convert.FromBase64String(base64Attachment));
ms.Position = 0; // important
ContentType ct = new ContentType(MediaTypeNames.Image.Jpeg);
Attachment attachment = new Attachment(ms, ct);
// etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...