2009-08-12 4 views
6

Ich muss Zeug aus einer Outlook-Nachrichtendatei lesen. Derzeit verwende ich eine Klasse von CodeProject.com Projekt, um dies zu erreichen, da die Bereitstellung von VSTO und Outlook auf einem Server keine Option ist.Wie lese ich das Empfangsdatum aus Outlook MSG-Dateien - ohne Outlook-API?

Diese Klasse erhält An, Von, CC, Betreff, Text und alles, was ich sonst noch von der msg-Datei benötige, außer Datumsinformationen (wie Empfangsdatum und Sendetermin).

Es gibt einige (wirklich, wirklich Low-Level) documentation auf, wie man Sachen aus MSG-Dateien auf MSDN bekommen, aber es ist ein wenig über den Rahmen dieses Projekts und erwähnt keine Daten überhaupt.

Idealerweise könnte ich einen Drop-in Ersatz für die Klasse haben, die ich jetzt benutze (OutlookStorage.cs im zuvor erwähnten CodeProject) oder die vorhandene Klasse etwas modifizieren können. Um zu modifizieren, würde ich die korrekte 4-Zeichen-Hexadezimal-Prop-Kennung für das Empfangsdatum benötigen. Zum Beispiel wird der Betreff als PR_SUBJECT = "0037" aufgelistet und Körper wird als PR_BOY = "1000" aufgeführt.

Antwort

2

Ich denke, die Aspose Bibliothek wird tun, was Sie wollen, ok es eine Drittpartei lib so möglicherweise nicht was Sie wollen. Es gibt ein paar VBS-Skripte, die grundlegende Informationen aus msg-Dateien erhalten, die übersetzt werden können.

1

Haben Sie einen Hauch von this:

string fullFileName = "c:\message.msg"; 
DateTime dateRevieved = new DateTime(); 

StreamReader sr = new StreamReader(fullFileName, Encoding.Default); 
string full = sr.ReadToEnd(); 

string date; 
int iStart; 
int iLast; 

string caption; 

//This -should- handle all manner of screwage 
//The ONLY way it would not is if someone guessed the -exact- to-the-second 
//time that they send the message, put it in their subject in the right format 
while (true) {  //not an infinite loop, I swear! 

    caption = "Date:"; 
    if (full.IndexOf("Date:") > -1) { //full shortens with each date is removed 
     string temp = ""; 

     iStart = full.LastIndexOf(caption); 
     temp = full.Remove(0, iStart + caption.Length); 
     full = full.Substring(0, iStart); 

     iLast = temp.IndexOf("\r\n"); 
     if (iLast < 0) { 
      date = temp; 
     } else { 
      date = temp.Substring(0, iLast); 
     } 

     date = date.Trim(); 

     if (date.Contains(subject) || subject.Contains(date)) { 
      continue; //would only happen if someone is trying to screw me 
     } 

     try { 
      dateRevieved = DateTime.Parse(date); //will fail if not a date 
      break; //if not a date breaks out of while loop 
     } catch { 
      continue; //try with a smaller subset of the msg 
     } 
    } else { 
     break; 
    } 
} 

Diese Art von Hack ist im Vergleich zu den Möglichkeiten, wie Sie andere Dinge von msg-Dateien mit etwas diesen lovely project bekommen können. Trotzdem hat es sich gegen alles gewehrt, was ich dagegen geworfen habe, und wie angemerkt, ist die einzige Möglichkeit, es zu täuschen, das genaue zweiteilige Datum in der Betreffzeile im richtigen Format anzugeben.

1

Ihre beiden Pfosten kombinieren würde ich die folgende Lösung vorschlagen:

zu ändern, würde ich die richtige 4 Zeichen müssen hexadezimale Kennung für empfangen Datum prop. Zum Beispiel, Betreff ist als PR_SUBJECT = "0037" und Body als PR_BOY = "1000" aufgelistet.

Suchen Sie nach "007D".

Verwenden Sie die Methode, die Sie in Ihrem zweiten Post zu den empfangenen Daten veröffentlicht haben, um das Problem zu beheben, wenn sich dieselbe (Datums-) Zeichenfolge im Betreff befindet.


Ich habe zu erwähnen, dass diese Methode nicht auf interne eMails zu funktionieren scheint: In Mails, die ich von Kollegen erhalten, gibt es keine substg1.0_007Dxxxx-Liegenschaften.

Hier scheint das Datum in substg1.0_0047xxxx versteckt zu sein.

Alles Gute!

inno

7

Wenn Sie OutlookStorage.cs von Codeproject verwenden, fügen Sie dann die folgenden Schritte aus:

private const string PR_RECEIVED_DATE="007D"; 
private const string PR_RECEIVED_DATE_2 = "0047"; 

... 

/// <summary> 
/// Gets the date the message was received. 
/// </summary> 
public DateTime ReceivedDate 
{ 
    get 
    { 
     if (_dateRevieved == DateTime.MinValue) 
     { 
      string dateMess = this.GetMapiPropertyString(OutlookStorage.PR_RECEIVED_DATE); 
      if (String.IsNullOrEmpty(dateMess)) 
      { 
       dateMess = this.GetMapiPropertyString(OutlookStorage.PR_RECEIVED_DATE_2); 
      } 
      _dateRevieved = ExtractDate(dateMess); 
     } 
     return _dateRevieved; 
     //return ExtractDate(dateMess); 
    } 
} 

private DateTime _dateRevieved = DateTime.MinValue; 

private DateTime ExtractDate(string dateMess) 
{ 
    string matchStr = "Date:"; 

    string[] lines = dateMess.Split(new String[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); 
    foreach (string line in lines) 
    { 
     if (line.StartsWith(matchStr)) 
     { 
      string dateStr = line.Substring(matchStr.Length); 
      DateTime response; 
      if (DateTime.TryParse(dateStr, out response)) 
      { 
       return response; 
      } 
     } 
    } 
    return DateTime.MinValue;     
}