2015-05-28 42 views
0

此刻,我正在努力將System.Net.Mail.MailMessage對象轉換爲Microsoft.Office.Interop.Outlook.MailItem之一。 一切似乎工作正常,但我需要幫助通過PropertyAccessor.SetProperty()方法設置SentOn MailItem屬性。使用PropertyAccessor.SetProperty方法發送Outlook 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 

由於我的代碼中的註釋表明,右/好日期值(2015年5月27日上午10時54分39秒)似乎要存儲的電子郵件項目裏面的時候我用PropertyAccessor.GetProperty()方法得到它,但是如果我試圖從eMail.SentOn屬性中獲得它,那麼我得到錯誤的日期值(2017/5/27 12:54:39)。

我也嘗試使用此說明創建sentOnDateTime DateTime DateTime sentOnDateTime = DateTime.Parse("Wed, 27 May 2015 10:54:39");但結果不變。

你有什麼建議?任何提示?謝謝。

+0

聽起來像一個UTC問題什麼的。這些'DateTime'值的'Kind'是什麼?也許你需要使用'ToLocalTime()'或'ToUniversalTime'? –

+0

當我創建'sentOnDateTime'時,我指定了'DateTimeKind.Local'值。我也試過'DateTimeKind.Unspecified'值,但問題仍然存在。 – baru

回答

0

如果您使用DateTimeKind.Local並不重要 - 日期時間值中沒有任何內容使得它本地或UTC。所有SetProperty看到的都是一個8字節浮點值,它壓縮COM中的DateTime。

MAPI將大多數PT_SYSTIME屬性存儲在UTC時區中,這是您需要傳遞給SetProperty的東西。當您閱讀時,SentOn屬性將UTC轉換爲本地時間。

作爲一個便箋,更大的問題將是Sent屬性 - OOM不會讓你設置它,所以你將需要創建一個郵件項目,而不是郵件項目,然後將MessageClass更改回「IPM.Note 「並刪除PR_ICON_INDEX。

如果使用Redemption是一個選項,它可以讓你導入使用RDIOMail .IMPORT方法MIME文件:

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 
0

嘗試使用UtcUnspecified值作爲SpecifyKind方法的第二個參數。

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

它不能解決我的問題,如果我使用'Utc'或'Unspecified'值,'SentOn'DateTime屬性仍然等於「2017/5/27 12:54:39 PM」。 – baru

相關問題