为什么MailItems在Outlook 2013中以撰写模式显示的已发送邮件文件夹中创建

时间:2016-10-06 14:14:35

标签: outlook outlook-addin mapi outlook-2013

我有一个Outlook 2013插件,它有一个我无法正常工作的ItemSend Eventhandler。

它的作用是:

  1. 循环所有收件人(to,cc,bcc)并为每个收件人创建一个单独的副本,仅将该电子邮件作为收件人发送。然后从发送的邮件文件夹中删除它们。这很好。

  2. 再创建一个副本,其中包含原始的to,cc和bcc信息。使用move-method将其移动到Sent items文件夹,因为Save会将它放在Outbox中。它一定不能实际发送,它应该只是你的个人副本,好像它已经正常发送一样。

  3. 设置cancel = true并使用discard关闭检查器窗口,因此也不会发送原始窗口。这也有效。

  4. 问题是保存的副本。当我打开它时,它处于撰写模式。基本上它和草稿一样。我希望看到它在读取模式下发送。

    我读过Sent-property确定要显示它的模式,但该属性是readonly,SentOn也是null,即使模式正确也是一个问题。有没有办法解决?

    我甚至尝试从“已发送邮件”文件夹中获取实际发送的其他邮件之一,编辑内容并保存。但这导致了相同的行为。 MailItem也发送了Sent = False和SentOn = null。

    这可能是因为即使调用了Send-in它还没有被发送,因为我们仍在运行EventHandler而我不认为Outlook实际上是在另一个线程中发送它?

    无论如何,这似乎不是一种有效的解决方法。

    任何想法如何实现这种功能?

1 个答案:

答案 0 :(得分:0)

在低(扩展MAPI)级别,只有在第一次保存项目之前,才能从PR_MESSAGE_FLAGS属性中删除MSGFLAG_UNSENT位(MAPI限制)。

在发送状态中创建的唯一OOM项是帖子项。创建帖子项目,将其MessageClass属性更改回IPM.Note,保存,记住项目的条目ID,使用Marshal.ReleaseComObject发布帖子项目(如果是.Net) ),然后使用Namespace.GetItemfromId重新打开它 - 您将在已发送状态中拥有MailItem个对象。您仍然需要更新/删除PR_ICON_INDEX属性以确保图标正确。

如果使用Redemption是一个选项,则可以设置Sent属性(保存之前)以及SentOn / ReceivedTime / {{1} } / Sender属性。

脱离我的头顶:

SentOnBehalfOf