Во-первых, состояние отправленного элемента можно изменить только до того, как оно будет сохранено в первый раз (ограничение MAPI). Во-вторых, Outlook всегда создает olMailItem
объектов в неотправленном состоянии. Единственный элемент, созданный в отправленном состоянии - это PostItem
(olPostItem
). Вы можете создать PostItem, изменить его свойство MessageClass на «IPM.Note», сохранить его, затем отпустить его с помощью Marshal.ReleaseComObject
(чтобы Outlook не забыл об этом), а затем снова открыть его, вызвав Namespace.GetItemFromID
- на этот раз Outlook должен вернуть объект MailItem
(вместо исходного PostItem
).
Имейте в виду, что значок будет неправильным, поэтому значок сообщения необходимо удалить - удалите свойство PR_ICON_INDEX
(DASL name http://schemas.microsoft.com/mapi/proptag/0x10800003
) с использованием MailItem.PropertyAccessor.DeleteProperty
.
Также имейте в виду, что Outlook не позволит вам установить некоторые свойства, которые он считает «важными», такие как даты сообщения, идентификатор записи отправителя и т. д. c. И установки только свойства SentOnBehalfOfName
будет недостаточно - необходимо установить идентификаторы записи отправителя, иначе пользователь не сможет правильно ответить на это сообщение.
При использовании Погашение является опцией, создание сообщения в состоянии отправки так же просто, как
set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set Inbox = Session.GetDefaultFolder(olFolderInbox)
set Msg = Inbox.Items.Add
Msg.Sent = true
set CU = Session.CurrentUser
set recip = Msg.Recipients.AddEx(CU.Name, CU.SmtpAddress, "SMTP", olTo)
Msg.Subject = "fake received message"
Msg.Body = "just a test"
vSenderEntryId = Session.AddressBook.CreateOneOffEntryID("Joe The Sender", "SMTP", "joe@domain.demo", false, true)
set vSender = Session.AddressBook.GetAddressEntryFromID(vSenderEntryId)
Msg.Sender = vSender
Msg.SentOnBehalfOf = vSender
Msg.SentOn = Now
Msg.ReceivedTime = Now
Msg.Save