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: - /
3 Réponses :
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
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");
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 code > 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>
Merci d'avoir clarifié cela!