2016-04-10 8 views
0

Für meine Outlook-Addin Ich muss E-Mails behandeln, berechnen eindeutige Hash und speichern Sie diesen Hash auf einem Server/Datenbank. Zum Beispiel:Erhalten Nachrichten-ID nach dem Senden von E-Mail

sind 4 Benutzer:

Fall 1:

User1 sendet eine Mail an User2 und User3. User2 möchte die mailhash serverside speichern, also klickt er auf eine Addin-Schaltfläche. Ein Hash wird mit einem Code wie diesem berechnet

var accessor = mailItem.PropertyAccessor; 
var subject = accessor.GetProperty(_PR_SUBJECT_W_TAG).ToString(); 
var messageId = accessor.GetProperty(_PR_INTERNET_MESSAGE_ID_W_TAG).ToString(); 
var hash = CalulateHash(subject + messageId); 

Dieser Hash wird auf dem Server gespeichert. Wenn User3 versucht, den Hash der E-Mail zu speichern, erhält er den gleichen Hash (Ursache Betreff und MessageID sollte gleich sein ==>rfc822) und der Server weiß, er hat diesen Hash bereits. Das funktioniert sehr gut.

Fall 2: User1 will,User3 und randomperson eine Mail an User2 senden. Ursache randomperson gehört nicht zu ihrer Firma, User1 möchte die Funktion SendAndStore() verwenden. Bevor die Mail

an die neue E-Mail senden, wird eine benutzerdefinierte Eigenschaft hinzugefügt
mailItem.UserProperties.Add("HandleAfterSent", MSOutlook.OlUserPropertyType.olText); 
var aasProp = mailItem.UserProperties.Find("HandleAfterSent"); 
if (aasProp != null) 
{ 
    aasProp.Value = "some_value"; 
} 
mailItem.Save(); 

SendMailItem(mailItem); 

Darüber hinaus gibt es eine Möglichkeit, wenn ein neues Element an einen inboxfolder hinzugefügt wird, um informiert ist. Also ich beobachte den geschickt Ordner.

inbox = outlookNameSpace.GetDefaultFolder(MSOutlook.OlDefaultFolders.olFolderSentMail); 
items = inbox.Items; 
items.ItemAdd += OnInboxItemAdded; 

Wenn die Mail über SendMailItem(mailItem); senden, wird der Handler (funktioniert auch in Ordnung) genannt. Leider habe ich Probleme mit der Hash-Berechnung der zu sendenden Mail, da diese Mail keine Message-ID hat. Hat jemand eine Idee, wie man die Message-ID einer Mail bekommt, die gerade gesendet wurde. Ich habe bereits versucht, die Message-ID selbst zu setzen, aber es ist von MS Exchange Server überschrieben.

EDIT: Outlook ist im Cache-Modus. Ich benötige eine Möglichkeit, die Nachrichten-ID für dieses Szenario auch zu erhalten.

EDIT2 (zusätzlich zu den Kommentaren): Fall 3: randomperson will eine Mail an User1 schicken, User2 und User3. Ursache randomperson gehört nicht zu ihrer Firma, User1 möchte die Funktion StoreFromInbox() verwenden. Mails im Posteingang aller drei Benutzer haben die gleiche Nachrichten-ID. Sie haben jedoch unterschiedliche _PR_SEARCH_KEY_, daher können wir diese Eigenschaft nicht verwenden.

+1

Dies könnte relevant sein: http://stackoverflow.com/questions/19029082/pr-internet-message-id-returns-blank-when-sending-message –

+0

Das ist relevant, Sie haben Recht. Ohne Cache-Modus funktioniert es. Aber gibt es eine Möglichkeit, die ID auch im Cache-Modus zu bekommen? – Kooki

Antwort

1

Versuchen Sie, PR_SEARCH_KEY MAPI-Eigenschaft zu verwenden - es sollte gleich bleiben, nachdem die Nachricht gesendet und in den Ordner Gesendete Objekte verschoben wurde.

+0

sollte ich es als Wert für den Hash-Code verwenden? Ich habe einen Code geändert, um mehr Einlösungsfunktionen zu verwenden. aber momentan habe ich eine Ausnahme, wenn ich 'rdoSession.GetMessageFromID (outlookMailItem.EntryID, outlookMailItem.Parent.StoreID, 0x200) als IRDOMail; '. Ich hoffte, die Nachrichten-ID mit diesem Code auch im Cache-Modus – Kooki

+0

verdammt Outlook-Cache zu bekommen. wenn ich einen Timer verwende und 'rdoSession.GetMessageFromID (outlookMailItem.EntryID, outlookMailItem.Parent.StoreID, 0x200) als IRDOMail anrufe; 'gibt es keine Ausnahme, etwa eine Minute nach dem Senden der Mail. Gibt es eine andere Lösung statt zu warten? – Kooki

+0

Sicher, ich sehe nicht, warum nicht - Hash nur den Wert von PR_SEARCH_KEY. Warum öffnest du den Gegenstand wieder mit seiner Eintrags-ID? –