C# 如何从内存制作outlook邮件附件?

C# 如何从内存制作outlook邮件附件?,c#,.net,outlook-addin,C#,.net,Outlook Addin,通过Attachments.Add()将新的System.Net.Mail.Attachment添加到Outlook.MailItem.Attachments会导致System.ArgumentException:“抱歉,出现问题。”。您可能想再试一次。“ 正在尝试将Base64中编码的JPEG图像作为附件添加到Outlook中的邮件项目。我将编码图像存储为变量,将其转换为内存流,然后转换为附件 public void CreateMessageWithAttachment(){ Outlook

通过
Attachments.Add()
将新的
System.Net.Mail.Attachment
添加到
Outlook.MailItem.Attachments
会导致
System.ArgumentException:“抱歉,出现问题。”。您可能想再试一次。“

正在尝试将Base64中编码的JPEG图像作为附件添加到Outlook中的邮件项目。我将编码图像存储为变量,将其转换为内存流,然后转换为附件

public void CreateMessageWithAttachment(){
Outlook.MailItem-mailIttem=thisAddIn.Application.CreateItem(Outlook.OlItemType.olMailItem);
字符串base64Attachment=“/…base64胡言乱语”;
MemoryStream ms=新的MemoryStream(转换.FromBase64String(base64Attachment));
ContentType ct=新的ContentType(MediaTypeNames.Image.Jpeg);
附件=新附件(ms、ct);
attachment.ContentDisposition.FileName=“look_at_dis.jpg”;
mailIttem.Subject=“测试带有附件的电子邮件”;
mailIttem.To=”friend@company.com";
mailIttem.Body=“此消息已通过编程方式生成”;
mailIttem.Attachments.Add(attachment);//这会引发“对不起…”表达式
mailIttem.Display(true);
}

引发System.ArgumentException:“抱歉,出现了问题。您可能想再试一次。“,这不会告诉我任何信息:-/

在将内存流附加到消息之前,我相信您必须将其位置重置为零:

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
给我的印象是,
Attachments.Add
应该只处理文件路径,因此将
MemoryStream
保存到临时文件并附加它就解决了问题

string tempFilePath=Path.GetTempPath()+“查看dis.jpg”;
FileStream fs=newfilestream(tempFilePath,FileMode.Create);
CopyTo女士(财政司司长);
fs.Close();
Add(tempFilePath,Outlook.OlAttachmentType.olByValue,1,“查看dis.jpg”);

MailItem.Attachments.Add
仅允许传递字符串(文件的完全限定路径)或其他Outlook项目(例如
MailItem
)作为参数


在扩展MAPI级别(仅限C++或Delphi),它只接受一个
IStream
(您应该使用
IAttach::OpenProperty
打开
PR\u ATTACH\u DATA\u BIN
作为
IStream
)。如果使用(我是它的作者)是一个选项,它允许传递url、文件名、另一个Outlook项目、
IStream
IStorage
COM接口、另一个附件(
Outlook.attachment
Redemption.RDOAttachment
IAttach
MAPI接口)或数组(变量或字节)添加到..

感谢您的澄清!