通过c#编码将邮件正文复制到Outlook中的新邮件

时间:2015-10-21 08:50:44

标签: c# outlook

在Outlook 2013中,我希望以编程方式在新邮件中添加邮件正文的内容 以下是我的代码:

void Inspectors_NewInspector(Microsoft.Office.Interop.Outlook.Inspector Inspector)
{
     Outlook.MailItem mailItem = Inspector.CurrentItem as Outlook.MailItem;
     Outlook.Application oApp = new Outlook.Application();
     Outlook.Explorer oExplorer = oApp.ActiveExplorer();
     Outlook.Selection oSelection = oExplorer.Selection;

     foreach (object item in oSelection)
     {
         Outlook.MailItem mi = (Outlook.MailItem)item;
         mailItem.HTMLBody = mi.HTMLBody;
     }
}

一切正常,但不显示原始邮件中的图像。而是显示类似cid:image002.png的内容。

不确定是什么原因。

我也想把它交给客户,所以我无法在本地保存邮件内容。

2 个答案:

答案 0 :(得分:4)

如果您在邮件正文的HTML标记中看到cid:image002.png语句,则还需要将嵌入项目附加到新电子邮件中。

添加嵌入图像的基本原则是将图像附加到项目,然后使用HTMLBody编写HTML以将附件cid添加为HTML中的参考。

Attachment attachment = newMail.Attachments.Add(
 @"E:\Pictures\image001.jpg"
, OlAttachmentType.olEmbeddeditem
, null
, "Some image display name"
);

string imageCid = "image001.jpg@123";

attachment.PropertyAccessor.SetProperty(
 "http://schemas.microsoft.com/mapi/proptag/0x3712001E"
, imageCid
);

newMail.HTMLBody = String.Format(
 "<body><img src=\"cid:{0}\"></body>"
, imageCid
);

请注意,您需要将文件保存在磁盘上并将其重新附加到新电子邮件中。 Attachment类的Add方法接受文件(由具有文件名的完整文件系统路径表示)或构成附件的Outlook项。

另外,我建议使用OOM对象避免代码中的foreach循环。请改用for循环。它允许立即释放底层COM对象。完成使用后,使用System.Runtime.InteropServices.Marshal.ReleaseComObject释放Outlook对象。然后在Visual Basic中将变量设置为Nothing(C#中为null)以释放对该对象的引用。您可以在Systematically Releasing Objects文章中详细了解相关内容。

答案 1 :(得分:1)

据我所知,你想把现有mailitem的附件复制到新的...然后你可以试试这个

foreach( var x in mailItem.Attachments)
{
    mi.Attachments.Add(x);
}