我正在为Outlook开发一个VSTO插件,它在TabNewMailMessage功能区选项卡中放置一个按钮,允许您通过我的安全API而不是通过电子邮件发送消息。一切都运作得很好,除了我追逐到角落里有一个讨厌的问题,我无法解决。
我需要消息的行为更像是已发送的消息,而不像保存的消息草稿。
我首先将邮件保存到Outlook中的默认已发送邮件文件夹中,但我无法将邮件与Outlook发送的邮件一起整理,因为我的邮件没有发送日期'。
所以我开始将它们保存在自定义文件夹中,但现在它们显示TabNewMailMessage而不是TabReadMail,就像其他已发送的消息一样。
最终,我需要将这些消息保存在某个地方的Outlook中,而不是实际发送,而是显示并表现为已发送消息。最好的结果是强制TabReadMail行为,第二好的可能是禁用TabNewMailMessage上的发送组。我已尝试在SO上找到一些方法,但我的GetInspector()没有CommandBars。
答案 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