强制Outlook显示TabReadMail而不是TabNewMailMessage

本文关键字:TabNewMailMessage TabReadMail Outlook 显示 强制 | 更新日期: 2023-09-27 18:15:48

我正在为Outlook开发一个VSTO插件,在TabNewMailMessage ribbon选项卡中放置一个按钮,允许您通过我的安全API而不是通过电子邮件发送消息。一切都运行得很好,除了有一个麻烦的问题,我一直纠缠在角落里,我无法解决。

我需要消息表现得更像已发送的消息,而不像已保存的消息草稿。

我开始将邮件保存在Outlook默认的已发送邮件文件夹中,但我无法将邮件与Outlook已发送邮件一起组织,因为我的邮件没有"发送日期"。

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

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

强制Outlook显示TabReadMail而不是TabNewMailMessage

需要创建处于已发送状态的消息。Outlook Object Model不允许你直接这样做——MailItem.Sent属性是只读的。

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

如果使用Redemption(我是它的作者)是一个选项,您可以设置RDOMail。第一次保存消息之前的Sent属性(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
相关文章:
  • 没有找到相关文章