2014-09-29 33 views
1

我正試圖從Outlook插件獲取發送的郵件時遇到了一些問題。在Outlook Addin中收到發送的郵件

onItemSend事件,我打開一個對話框,它顯示了一些領域,有消息信息,如收件人,主題等,並一個按鈕,將保存這些信息進入我們的數據庫。另一個要求是,以保存已發送郵件的副本,這是我卡住了...

我可以使用另存爲方法保存該消息,但問題是,當我打開該郵件,它顯示:

此消息尚未發送。此消息將通過 的Microsoft Exchange

發送導致一些問題的用戶,讓他們覺得不發送的消息。

在我的搜索期間,我發現this thread其中一個人有同樣的問題,並且解決方法是使用郵件作爲PostItem而不是MailItem,一旦PostItem被創建爲發送狀態。此外,我們應該將MessageClass屬性設置爲IPM.Note並刪除PR_ICON_INDEX

下面是我用來執行上述步驟的代碼。我發現這個代碼here和改變了一點點:

PostItem postItem = this._email.Application.CreateItem(OlItemType.olPostItem); 
postItem.MessageClass = "IPM.Note"; 
PropertyAccessor pa = postItem.PropertyAccessor; 
pa.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x10800003", -1); 
postItem.Save(); 

NameSpace session = postItem.Session; 
string postItemEntryID = postItem.EntryID; 
Marshal.ReleaseComObject(postItem); 
Marshal.ReleaseComObject(pa); 

MailItem newMessage = session.GetItemFromID(postItemEntryID) as MailItem; 
newMessage.BCC = this._email.BCC; 
newMessage.Body = this._email.Body; 
newMessage.BodyFormat = this._email.BodyFormat; 
newMessage.CC = this._email.CC; 
newMessage.HTMLBody = this._email.HTMLBody; 

//Hard coded path just for illustration 
newMessage.SaveAs("C:\\Temp\\MSG\test.msg", OlSaveAsType.olMSG); 

上面的代碼創建一個postitem對象,設置一些屬性並保存到正確的路徑,但它有以下問題:

  1. 執行postItem.save,創建postitem消息後,它會在收件箱中讀取消息

  2. 保存的消息後,我比較了文件和S在有意義的情況下,原始郵件大小爲580kb,保存後的郵件爲52kb。看起來它沒有複製消息

  3. 它丟失了某些嵌入到消息中的圖像,如簽名圖像,顯示了紅色的X。

我如何獲得/創建消息,用確切的消息內容,收件人,附件,屬性等(克隆那種)與發送的狀況,而無需創建收件箱文件夾內的另一消息?

謝謝

+0

請,我必須執行這樣的事情,你可以提供給我的源代碼,或指出我在哪裏可以找到解決方案,我需要存儲一些電子郵件到我們的數據庫。你是怎樣做的 ? – 2016-09-06 08:38:13

+0

請看看[this](https://blogs.msdn.microsoft.com/emeamsgdev/2011/12/06/process-incoming-mail-using-an-outlook-addin)。在這個例子中,它展示瞭如何獲取收到的電子郵件並對其進行處理。如果您需要發送項目,請添加如下所示的處理程序:this.itemsendhndler = new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend); this.Application.ItemSend + = itemsendhndler ;.讓我知道你是否需要任何其他的東西。 :) – UncleFester 2016-09-07 16:13:58

回答

1

我不會這樣做Outlook郵件正試圖發送。您可以

  1. 處理已發送郵件文件夾中的Items.ItemAdd事件。到那個時候消息被髮送並且所有發送者相關的屬性被設置。

  2. 您可以通過刪除未發送的標誌來「修復」創建的MSG文件。您可以使用Redemption - 致電RDOSession .GetMessageFromMsgFile/RDOMail.Sent = true/RDOMail.Save。請記住,發件人信息可能尚未設置。

+0

嗨德米特里!只是關於你的第一個建議的問題......我已經閱讀過某處,用戶可以更改已發送的項目文件夾。如果用戶更改此文件夾,我是否可以獲取發送的消息?我必須在itemAdd事件之前設置發送的文件夾嗎?如果我更改發送的文件夾位置,它是否會覆蓋用戶的選項?感謝您的建議 – UncleFester 2014-09-30 13:43:47

+0

您可以跟蹤Application.ItemSend事件並檢查MailItem.SaveSentMessageFolder屬性是否指向由Namespace.GetDefaultFolder(使用Namespace..CompareEntryIds)返回的期望的已發送郵件文件夾。然後,您可以跟蹤該文件夾上的ItemAdd事件,或將自定義文件夾的條目標識保存在自定義屬性(MailItem.UserProperties)中,並將SaveSentMessageFolder屬性重置爲默認的已發送郵件文件夾。當您在該文件夾上處理ItemAdd時,可以使用該自定義屬性打開自定義文件夾並將消息移動到那裏。 – 2014-09-30 21:15:52

+0

嗨德米特里你可以解釋如何「跟蹤該文件夾上的ItemAdd事件」。這是否意味着將「Public WithEvents justinreserve1 As Outlook.Items」這樣的東西進行定義,然後將其用於該文件夾? – Max 2014-10-01 13:03:14

0

我不會走那條路與「postitem」進一步,不知它看起來不完美的方式適合我。

問題是,您正在複製它發送的項目。因此該副本表示它尚未發送。 如果你不需要它保存在「已發送郵件」 - 文件夾「正常」的副本,你可以只改變其中項目被保存

Set mailitem.SaveSentMessageFolder = someother Folder '(which is defined as Outlook.folder) 

的文件夾,如果這是不可能的,那麼我將對「已發送的項目」文件夾進行檢查(在ThisOutlookSession中),併爲其中的每個新項目進行復制操作。如果你不知道如何讓我知道,那麼我會複製你一些代碼來爲你提供幫助。

另一個問題,只是因爲IAM好奇:你爲什麼打開窗體並等待某人按下OK按鈕,而不是立刻將數據保存到你的數據庫?

+0

嗨馬克斯,謝謝你的建議。我會嘗試......關於你的好奇心,我會在窗體上顯示另一個字段,用戶將在其中添加註釋,從某些下拉列表中選擇一些數據,然後當用戶點擊確定按鈕時,它將保存所有的用戶選擇和消息本身。我只是沒有寫在窗體上發生的所有事情:)謝謝 – UncleFester 2014-09-30 13:34:55

+0

嗨,「發送項目」文件夾「的檢查(在ThisOutlookSession中)與Dimitri的建議是一樣的,當然他有更好的解釋。在這裏這也只會在用戶沒有更改sent-items-Folder或者甚至是vba的情況下才起作用。 – Max 2014-10-01 13:04:03

相關問題