如何将Outlook Mailitem保存为已发送邮件

时间:2020-02-25 08:32:01

标签: c# outlook vsto mailitem

我已经创建了Outlook邮件项目,并希望将其作为已发送邮件保存在文件夹中。我可以使用mail.SentOnBehalfofName设置发件人邮件。如何在此添加日期字段。我有一些eml电子邮件,我想添加到没有付费库的文件夹中。我能够解析并将其保存到Outlook文件夹,但日期字段设置为“无”。有人可以帮助将日期字段设置为Outlook mailitem对象,还是一种创建可以使用所有属性保存在Outlook中的邮件项目的方法?

1 个答案:

答案 0 :(得分:0)

首先,只能在第一次保存项目之前更改其发送状态(MAPI限制)。其次,Outlook始终以未发送状态创建olMailItem对象。在发送状态下创建的唯一项目是PostItemolPostItem)。您可以创建一个PostItem,将其MessageClass属性更改为“ IPM.Note”,保存它,然后使用Marshal.ReleaseComObject释放它(以确保Outlook忘记它),然后通过校准Namespace.GetItemFromID重新打开它-这次,Outlook应该返回一个MailItem对象(而不是原始的PostItem)。

请记住,图标将是错误的,因此需要删除帖子图标-使用PR_ICON_INDEX删除http://schemas.microsoft.com/mapi/proptag/0x10800003属性(DASL名称为MailItem.PropertyAccessor.DeleteProperty)。

还要记住,Outlook不允许您设置一些它认为“重要”的属性-例如消息日期,发件人条目ID等。仅设置SentOnBehalfOfName属性是不够的-必须设置发件人条目ID,否则用户将无法正确回复该邮件。

如果可以选择使用Redemption,则在发送状态下创建消息就像

  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