强制Outlook显示TabReadMail而不是TabNewMailMessage

时间:2014-07-31 18:54:34

标签: c# outlook vsto

我正在为Outlook开发一个VSTO插件,它在TabNewMailMessage功能区选项卡中放置一个按钮,允许您通过我的安全API而不是通过电子邮件发送消息。一切都运作得很好,除了我追逐到角落里有一个讨厌的问题,我无法解决。

我需要消息的行为更像是已发送的消息,而不像保存的消息草稿。

我首先将邮件保存到Outlook中的默认已发送邮件文件夹中,但我无法将邮件与Outlook发送的邮件一起整理,因为我的邮件没有发送日期'。

所以我开始将它们保存在自定义文件夹中,但现在它们显示TabNewMailMessage而不是TabReadMail,就像其他已发送的消息一样。

最终,我需要将这些消息保存在某个地方的Outlook中,而不是实际发送,而是显示并表现为已发送消息。最好的结果是强制TabReadMail行为,第二好的可能是禁用TabNewMailMessage上的发送组。我已尝试在SO上找到一些方法,但我的GetInspector()没有CommandBars。

1 个答案:

答案 0 :(得分:2)

您需要在已发送状态下创建消息。 Outlook对象模型不允许您直接执行此操作 - MailItem.Sent属性是只读的。

似乎工作的唯一解决方法(至少到目前为止)是创建一个新的PostItem对象(它在发送状态下创建),将其MessageClass属性设置为IPM.Note,保存它。然后,您可以使用Namespace.GetItemFromId重新打开消息 - 因为您重置了消息类,您将获得常规的MailItem对象。图标可能仍然是错误的,因此您需要使用MailItem.PropertyAccessor重置/删除它(您需要PR_ICON_INDEX属性,其DASL名称为http://schemas.microsoft.com/mapi/proptag/0x10800003)。

如果使用Redemption是一个选项,您可以设置RDOMail。在第一次保存邮件之前发送属性(MAPI限制):

  set Session = CreateObject("Redemption.RDOSession")
  Session.MAPIOBJECT = Application.Session.MAPIOBJECT
  set Folder= Session.GetDefaultFolder(olFolderSentMail)
  set Msg = Folder.Items.Add

  Msg.Sent = true
  Msg.Unread = false
  Msg.Recipients.AddEx "Fake User", "someuser@fake.domain.com",  "SMTP"
  Msg.Subject = "fake sent message"
  Msg.Body = "test body"
  Msg.ReceivedTime = #2014/08/01 5:00PM#
  Msg.SentOn = #2014/08/01 5:00PM#
  Msg.Sender = Session.CurrentUser
  Msg.SentOnBehalfOf = Session.CurrentUser

  Msg.Save