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

Cloning an outlook email to resend

我想在我的 Outlook 2016 加载项中添加一个 "resend" 上下文菜单,以重新发送电子邮件。原始电子邮件应重新显示给用户,以便他在必要时进行任何修改,然后按 'send' 按钮。似乎我需要创建电子邮件的副本,因为在原始消息(或使用 MailItem.Copy() 创建的副本)上调用 Display() 只是查看消息,而不是通过发送显示它可编辑按钮。

到目前为止我已经明白了 - 非常简单:

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

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

Outlook 对象模型公开了 MailItem.Copy 方法,但它创建了一个与原始 sent/unsent 状态相同的副本。

如果使用 Redemption (I am its author) is an option, you can use 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()