使用PropertyAccessor设置Outlook MailItem属性时遇到问题.SetProperty方法

本文关键字:遇到 问题 SetProperty 方法 属性 PropertyAccessor 设置 Outlook MailItem 使用 | 更新日期: 2023-09-27 17:51:01

目前我正在努力将System.Net.Mail.MailMessage对象转换为Microsoft.Office.Interop.Outlook.MailItem对象。一切似乎都很好,但我需要帮助通过PropertyAccessor.SetProperty()方法设置SentOn MailItem属性。

我在MailMessage头中读取发送的日期信息,它返回一个字符串对象,然后我将其转换为DateTime,最后我使用SetProperty()方法保存此信息。

下面是我的代码:
MailMessage mMessage= MailMessageMimeParser.ParseMessage(emlFilePath);
eMail = (Outlook.MailItem)application.CreateItem(Outlook.OlItemType.olMailItem);
//  here I set 'Subject', 'To', 'CC', 'BCC' etc. properties...
// then try to set the 'SentOn' property
string sentOnString = mMessage.Headers["Date"]; // Wed, 27 May 2015 10:54:39 +0200
DateTime sentOnDateTime = DateTime.SpecifyKind(DateTime.Parse(sentOnString), DateTimeKind.Local); // 5/27/2015 10:54:39 AM
string PR_CLIENT_SUBMIT_TIME = "http://schemas.microsoft.com/mapi/proptag/0x00390040";
eMail.PropertyAccessor.SetProperty(PR_CLIENT_SUBMIT_TIME, sentOnDateTime);
eMail.Save(); // here the SentOn property is  5/27/2017 12:54:39 PM
DateTime date = (DateTime)eMail.PropertyAccessor.GetProperty(PR_CLIENT_SUBMIT_TIME); // 5/27/2015 10:54:39 AM
...
return eMail; // here the SentOn property is  5/27/2017 12:54:39 PM

正如我的代码注释所建议的那样,正确/良好的日期值(5/27/2015 10:54:39 AM)似乎存储在电子邮件项目中,当我使用PropertyAccessor.GetProperty()方法获得它时,但如果我试图从eMail.SentOn属性获得它,那么我得到一个错误的日期值(5/27/2017 12:54:39 PM)。

我也试着用DateTime sentOnDateTime = DateTime.Parse("Wed, 27 May 2015 10:54:39");指令创建sentOnDateTime DateTime,但结果没有改变。

你有什么建议?有提示吗?谢谢你。

使用PropertyAccessor设置Outlook MailItem属性时遇到问题.SetProperty方法

如果您使用DateTimeKind.Local并不重要-在datetime值中没有任何东西固有地使其成为本地或UTC。所有SetProperty看到的是一个8字节的浮点值,它抑制了COM中的DateTime。

MAPI将大多数PT_SYSTIME属性存储在UTC时区,这就是您需要传递给SetProperty的属性。SentOn属性在读取世界时将UTC转换为本地时间。

作为旁注,更大的问题将是Sent属性- OOM将不允许您设置它,所以您将需要创建一个post项目而不是mail项目,然后将MessageClass更改回"IPM.Note "并删除PR_ICON_INDEX .

如果使用Redemption是一个选项(我是它的作者),它将允许您使用RDIOMail导入MIME文件。Import方法:

  set Session = CreateObject("Redemption.RDOSession")
  Session.MAPIOBJECT = Application.Session.MAPIOBJECT
  set Msg = Session.GetDefaultFolder(olFolderInbox).Items.Add
  Msg.Sent = true
  Msg.Import "C:'temp'test.eml", 1024
  Msg.Save

尝试使用Utc或未指定的值作为specifickind方法的第二个参数。

  DateTime sentOnDateTime = DateTime.SpecifyKind(DateTime.Parse(sentOnString), DateTimeKind.Utc);