强制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 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