在Outlook加载项中获取已发送邮件

本文关键字:获取 Outlook 加载项 | 更新日期: 2023-09-27 18:25:03

我在尝试从Outlook插件获取发送的消息时遇到了一些问题。

onItemSend事件中,我打开了一个对话框,其中显示了一些字段,包括收件人、主题等消息信息,以及一个将这些信息保存到数据库中的按钮。另一个要求是保存发送消息的副本,这就是我陷入困境的地方。。。

我可以使用SaveAs方法保存消息,但问题是当我打开消息时,它显示:

此消息尚未发送。此消息将通过发送Microsoft Exchange

导致用户出现一些问题,使他们认为消息没有发送。

在搜索过程中,我发现另一个人也有同样的问题,解决方案是在PostItem创建为已发送状态后,将邮件用作PostItem而不是MailItem。此外,我们应该将MessageClass属性设置为IPM。注意并删除PR_ICON_INDEX

这是我用来执行上述步骤的代码。我在这里找到了这个代码,并做了一些更改:

PostItem postItem = this._email.Application.CreateItem(OlItemType.olPostItem);
postItem.MessageClass = "IPM.Note";
PropertyAccessor pa = postItem.PropertyAccessor;
pa.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x10800003", -1);
postItem.Save();
NameSpace session = postItem.Session;
string postItemEntryID = postItem.EntryID;
Marshal.ReleaseComObject(postItem);
Marshal.ReleaseComObject(pa);
MailItem newMessage = session.GetItemFromID(postItemEntryID) as MailItem;
newMessage.BCC = this._email.BCC;
newMessage.Body = this._email.Body;
newMessage.BodyFormat = this._email.BodyFormat;
newMessage.CC = this._email.CC;
newMessage.HTMLBody = this._email.HTMLBody;
//Hard coded path just for illustration
newMessage.SaveAs("C:''Temp''MSG'test.msg", OlSaveAsType.olMSG); 

上面的代码创建了一个postitem对象,设置了一些属性并正确地保存到路径中,但它有以下问题:

  1. 执行postItem.save后,要创建postItem消息,它会在收件箱文件夹中创建一条已读消息

  2. 保存消息后,我比较了文件和重要的大小,原始消息大小为580kb,邮件保存后的消息大小为52kb。它似乎没有复制的消息

  3. 它丢失了一些嵌入消息中的图像,例如签名图像,显示了一个红色的X。

如何获取/创建一封具有确切邮件内容、收件人、附件、属性等(克隆类型)和已发送状态的邮件,而不在收件箱文件夹中创建另一封邮件?

感谢

在Outlook加载项中获取已发送邮件

我不会对Outlook试图发送的邮件执行此操作。你可以

  1. 处理"已发送邮件"文件夹中的Items.ItemAdd事件。到那时,邮件将被发送,并且所有与发件人相关的属性都已设置。

  2. 你可以"修复";通过移除未发送标志来删除所创建的MSG文件。你可以使用Redemption(我是它的作者)-调用RDOSession。GetMessageFromMsgFile/R DOMail.Sent = true/RDOMail.Save。请记住,可能尚未设置发件人信息。

我不会对"postitem"更进一步,不知何故,它看起来对我来说并不完美。

问题是您正在复制发送的项目。因此,复印件上说它还没有寄出。如果您不需要保存在"已发送项目"文件夹中的"普通"副本,您可以使用更改保存项目的文件夹

Set mailitem.SaveSentMessageFolder = someother Folder '(which is defined as Outlook.folder)

如果这不可能,那么我会(在ThisOutlookSession中)检查"已发送项目"文件夹,并对其中的每个新项目进行复制操作。如果你不知道如何让我知道,那么我会给你复制一些代码,让你上路。

另一个问题是,我很好奇:为什么你打开表格,等待有人点击"确定"按钮,而不是直接将数据保存到数据库中?