2
votes

Comment créer une pièce jointe Outlook à partir de la mémoire?

L'ajout d'un nouveau System.Net.Mail.Attachment à Outlook.MailItem.Attachments via Attachments.Add () entraîne un System.ArgumentException: 'Désolé, une erreur s'est produite. Vous voudrez peut-être réessayer. »

Vous essayez d'ajouter une image JPEG codée en Base64 en tant que pièce jointe à un élément de courrier dans Outlook. Je stocke une image encodée en tant que variable, je la convertis en un flux mémoire, puis en une pièce jointe.

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);
}

Lève System.ArgumentException: 'Désolé, une erreur s'est produite . Vous voudrez peut-être réessayer. », qui ne me dit rien: - /


0 commentaires

3 Réponses :


0
votes

Avant de joindre le flux mémoire au message, je pense que vous devez réinitialiser sa position à zéro:

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


0 commentaires

1
votes

Les documents officiels m'ont donné l'impression que Attachments.Add est uniquement censé fonctionner avec les chemins de fichiers, donc enregistrer MemoryStream dans un fichier temporaire et le joindre résolu le problème.

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 commentaires

1
votes

MailItem.Attachments.Add permet uniquement de passer une chaîne (un chemin complet vers un fichier) ou un autre élément Outlook (par exemple MailItem ) comme paramètre. < / p>

Au niveau MAPI étendu (C ++ ou Delphi uniquement), il ne prend qu'un IStream (vous êtes censé ouvrir PR_ATTACH_DATA_BIN en tant que IStream en utilisant IAttach :: OpenProperty ). Si utiliser Redemption (j'en suis l'auteur) est une option, cela permet de passer une url, un fichier nom, un autre élément Outlook, IStream ou IStorage interface COM, une autre pièce jointe ( Outlook.Attachment ou Redemption.RDOAttachment ou IAttach MAPI interface) ou un tableau (de Variant ou d'octet) à RDOMail . Pièces jointes . Ajouter < / p>


1 commentaires

Merci d'avoir clarifié cela!