C# MailItem.CreationTime是只读的-有解决方法吗?

C# MailItem.CreationTime是只读的-有解决方法吗?,c#,outlook,outlook-addin,C#,Outlook,Outlook Addin,我最近发布了一篇关于电子邮件发送后如何保存的帖子——除了一个小细节外,我几乎所有的东西都能正常工作。基本上,我能够在电子邮件发送之前捕捉到它,并用它做任何我想做的事情——在我的情况下,保存它。但是,如果您尝试访问该电子邮件的CreationTime属性,它将在4501年1月1日上午12点返回。这很可能是因为它实际上还没有被“创建”,因为一旦我的代码完成执行并实际发送,它就会在“已发送邮件”文件夹中创建 我想把这封即将寄出的邮件保持原样。如果要复制副本,请将副本的CreationTime属性更改为

我最近发布了一篇关于电子邮件发送后如何保存的帖子——除了一个小细节外,我几乎所有的东西都能正常工作。基本上,我能够在电子邮件发送之前捕捉到它,并用它做任何我想做的事情——在我的情况下,保存它。但是,如果您尝试访问该电子邮件的CreationTime属性,它将在4501年1月1日上午12点返回。这很可能是因为它实际上还没有被“创建”,因为一旦我的代码完成执行并实际发送,它就会在“已发送邮件”文件夹中创建


我想把这封即将寄出的邮件保持原样。如果要复制副本,请将副本的CreationTime属性更改为DateTime。现在,保存副本,然后允许Outlook继续发送原件。然而,当我试图修改CreationTime时,我得到一个错误,即该属性是只读的。有没有办法“闯入”它?或者有什么方法可以强制写东西吗?

更好的方法是附加到已发送的邮件上,这样您就可以在邮件发送后而不是之前保存邮件,这样您的邮件应该是准确的。这可能是您的选择,也可能不是,但可能会缓解问题

Outlook.Folder sentItems = ThisAddIn.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
sentItems.Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(sentItems_ItemAdd);
// ...
void sentItems_ItemAdd(object Item)
{
  var msg = Item as Outlook.MailItem;
  msg.SaveAs(yourPath, Outlook.OlSaveAsType.olMSG);
}

注意:您需要处理正确的COM资源处理和错误处理。

更好的方法是将邮件附加到已发送的邮件上,这样您可以在邮件发送后而不是之前保存邮件,这样您的邮件应该是准确的。这可能是您的选择,也可能不是,但可能会缓解问题

Outlook.Folder sentItems = ThisAddIn.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
sentItems.Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(sentItems_ItemAdd);
// ...
void sentItems_ItemAdd(object Item)
{
  var msg = Item as Outlook.MailItem;
  msg.SaveAs(yourPath, Outlook.OlSaveAsType.olMSG);
}

注意:您需要处理正确的COM资源处理和错误处理。

您是否需要更改创建时间?是的,当我将文件保存到磁盘时,文件的创建时间设置为邮件项中的创建时间。我想我可以先保存电子邮件,然后修改生成文件的CreationTime,而不是在代码中这样做,但这看起来很混乱…虽然显然使用反射更改只读属性更混乱?只读属性就是这样。。除非你理解反射,否则看着MUG4N的链接我看不出哪里乱七八糟。。您需要更改该链接中的示例以适合您的用例是否有需要更改创建时间的原因?是的,当我将其保存到磁盘时,文件的创建时间设置为邮件项中的创建时间。我想我可以先保存电子邮件,然后修改生成文件的CreationTime,而不是在代码中这样做,但这看起来很混乱…虽然显然使用反射更改只读属性更混乱?只读属性就是这样。。除非你理解反射,否则看着MUG4N的链接我看不出哪里乱七八糟。。您需要更改该链接中的示例以适合您的用例。嗯,我更喜欢您的方法。但是,当我实现它时,我得到以下错误-“非静态字段、方法或属性'add-in name.ThisAddIn.Application'需要对象引用。如果您将此代码放在
ThisAddIn.cs
中,请尝试使用
Globals.ThisAddIn
this
。好的,这稍微降低了错误,但仍然是一个小问题(感谢您迄今为止的帮助!)”,基本上,第一个VisualStudio告诉我没有.ItemAdd,所以我把Intellisense给我的其他选项弄乱了,发现SentItems.Items.ItemAdd工作正常。我编辑了你的代码以反映这一点。无论如何,现在我得到一个错误,即ItemEvents\u ItemAddEventHandler在Microsoft.Office.Interop.Outlook中不存在。还有其他应该存在的地方吗?此页面:似乎说我应该能够使用ItemEvents\u Event.ItemAdd,尽管使用它我会收到一个错误,说ItemAdd在类型Microsoft.Office.Interop.Outlook.ItemEvents\u Event中不存在。看起来你把它拼错了..应该是
ItemsEvents\u Event.ItemAdd
ItemsEvents\u itemsaddeventhandler
Microsoft.Office.Interop.Outlook.dll中,我更喜欢你的方法。但是,当我实现它时,我得到以下错误-“非静态字段、方法或属性'add-in name.ThisAddIn.Application'需要对象引用。如果您将此代码放在
ThisAddIn.cs
中,请尝试使用
Globals.ThisAddIn
this
。好的,这稍微降低了错误,但仍然是一个小问题(感谢您迄今为止的帮助!)”,基本上,第一个VisualStudio告诉我没有.ItemAdd,所以我把Intellisense给我的其他选项弄乱了,发现SentItems.Items.ItemAdd工作正常。我编辑了你的代码以反映这一点。无论如何,现在我得到一个错误,即ItemEvents\u ItemAddEventHandler在Microsoft.Office.Interop.Outlook中不存在。还有其他应该存在的地方吗?此页面:似乎说我应该能够使用ItemEvents\u Event.ItemAdd,尽管使用它我会收到一个错误,说ItemAdd在类型Microsoft.Office.Interop.Outlook.ItemEvents\u Event中不存在。看起来你把它拼错了..应该是
ItemsEvents\u Event.ItemAdd
ItemsEvents\u itemsaddeventhandler
位于
Microsoft.Office.Interop.Outlook.dll中