在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
的内容。
不确定是什么原因。
我也想把它交给客户,所以我无法在本地保存邮件内容。
答案 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);
}