克隆Outlook电子邮件以重新发送

时间:2017-11-23 17:12:43

标签: vsto outlook-addin

我想在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错误。我做错了什么?

1 个答案:

答案 0 :(得分:1)

Attachments.Add仅允许传递指向文件或Outlook项目(例如MailItem)的完全限定路径的字符串。另请注意,您的代码仅复制收件人显示名称,这些名称可能已成功解析,也可能未成功解析。

Outlook对象模型公开MailItem.Copy方法,但它创建的副本处于与原始状态相同的已发送/未发送状态。

如果使用Redemption是一个选项,您可以使用RDOMailCopyTo()方法 - 它会复制所有属性和子对象(例如收件人和附件)但它会保持发送状态不变(因为在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()
相关问题