我想在Outlook 2016加载项中添加“重新发送”上下文菜单,以重新发送电子邮件。原始电子邮件应重新显示给用户,以便他在必要时进行任何修改,然后按“发送”按钮。我似乎需要创建电子邮件的副本,因为在原始邮件上调用Display()(或使用MailItem.Copy()创建的副本)只是查看邮件,而不是使用发送按钮显示它是可编辑的。
到目前为止我得到了这个 - 非常直接:
Outlook.MailItem clone = Globals.ThisAddIn.Application.CreateItem(Outlook.OlItemType.olMailItem) as Outlook.MailItem;
clone.SendUsingAccount = email.SendUsingAccount;
clone.To = email.To;
clone.CC = email.CC;
clone.BCC = email.BCC;
clone.Subject = email.Subject;
clone.Body = email.Body;
clone.HTMLBody = email.HTMLBody;
for (int i = 1; i <= email.Attachments.Count; ++i)
clone.Attachments.Add(email.Attachments[i], email.Attachments[i].Type, email.Attachments[i].Position, email.Attachments[i].DisplayName);
但是,我在尝试复制附件时收到DISP_E_MEMBERNOTFOUND错误。我做错了什么?
答案 0 :(得分:1)
Attachments.Add
仅允许传递指向文件或Outlook项目(例如MailItem)的完全限定路径的字符串。另请注意,您的代码仅复制收件人显示名称,这些名称可能已成功解析,也可能未成功解析。
Outlook对象模型公开MailItem.Copy方法,但它创建的副本处于与原始状态相同的已发送/未发送状态。
如果使用Redemption是一个选项,您可以使用RDOMail。CopyTo()
方法 - 它会复制所有属性和子对象(例如收件人和附件)但它会保持发送状态不变(因为在MAPI中,它只能在消息第一次保存之前设置)。
脱离我的头顶:
using Redemption;
...
RDOSession session - new RDOSession();
session.MAPIOBJECT = Globals.ThisAddIn.Application.Session.MAPIOBJECT;
RDOMail clone = session.GetDefaultFolder(rdoDefaultFolders.olFolderDrafts).Items.Add();
RDOMail original = (RDOMail)session.GetRDOObjectFromOutlookObject(email);
original.CopyTo(clone);
clone.Save();
MailItem OutlookClone = Globals.ThisAddIn.Application.Session.GetItemFromID(clone.EntryID);
OutlookClone.Display()