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

问题描述 投票:0回答:1

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

c# outlook vsto mailitem
1个回答
0
投票

首先,项目的发送状态只能在第一次保存之前更改(MAPI限制)。其次,Outlook始终在未发送状态下创建olMailItem对象。在发送状态下创建的唯一项目是PostItemolPostItem)。您可以创建一个PostItem,将其MessageClass属性更改为“ IPM.Note”,保存它,然后使用Marshal.ReleaseComObject释放它(以确保Outlook忘记它),然后通过caling 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", "[email protected]", false, true)
  set vSender = Session.AddressBook.GetAddressEntryFromID(vSenderEntryId)
  Msg.Sender = vSender
  Msg.SentOnBehalfOf = vSender
  Msg.SentOn = Now
  Msg.ReceivedTime = Now
  Msg.Save
© www.soinside.com 2019 - 2024. All rights reserved.