在Outlook Addin中获取已发送的消息

时间:2014-09-29 18:38:02

标签: c# email outlook outlook-addin

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

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

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

  

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

导致用户出现一些问题,让他们认为邮件没有发送。

在我的搜索过程中,我发现this thread其他人遇到了同样的问题,解决方案是在发送状态下创建PostItem后将消息用作PostItem而不是MailItem。另外,我们应该将MessageClass属性设置为 IPM.Note 并删除PR_ICON_INDEX

以下是我用于执行上述步骤的代码。我发现这段代码here并稍微改了一下:

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,postitem保存的邮件为52kb。它似乎没有复制消息

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

  4. 如何使用已发送状态获取/创建具有确切邮件内容,收件人,附件,属性等(克隆类型)的邮件,而无需在收件箱文件夹中创建其他邮件?

    谢谢

2 个答案:

答案 0 :(得分:1)

我不会对Outlook尝试发送的消息执行此操作。你可以

  1. 处理已发送邮件文件夹上的Items.ItemAdd事件。到那时发送消息并设置所有与发件人相关的属性。

  2. 您可以通过删除未发送的标志来“修复”创建的MSG文件。您可以使用Redemption执行此操作 - 调用RDOSession。GetMessageFromMsgFile / RDOMail.Sent = true / RDOMail.Save。请注意,可能尚未设置发件人信息。

答案 1 :(得分:0)

我不会用" postitem"此外,它对我来说看起来并不完美。

问题是你正在复制它发送的项目。因此副本说它还没有被发送。 如果你不需要"正常"保存在"已发送项目中的副本" -Folder,您只需更改保存项目的文件夹

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

如果那是不可能的,那么我会对"发送的项目进行检查(在ThisOutlookSession中)"文件夹并为其中的每个新项目制作复制操作。如果您不知道如何让我知道,那么我会复制一些代码以便为您提供帮助。

另一个问题,因为Iam很好奇:为什么要打开表单并等待某人点击确定按钮,而不是立即将数据保存到数据库中?