克隆 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()
我想在我的 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()