2009-08-12 20 views
6

Potrzebuję przeczytać rzeczy z pliku msg programu Outlook. Obecnie używam klasy z projektu CodeProject.com, aby to osiągnąć, ponieważ wdrażanie VSTO i Outlooka na serwerze nie jest opcją.Jak odczytać datę odebraną z plików MSG programu Outlook - bez interfejsu API Outlook?

Ta klasa pobiera do, Od, DW, Podmiot, Ciało i wszystko, czego potrzebuję z pliku msg, z wyjątkiem informacji Data (takich jak Data odebrana i Data wysłania).

Istnieje kilka (naprawdę, naprawdę niskiego poziomu) documentation, w jaki sposób pobrać pliki MSG na MSDN, ale jest to trochę poza zakresem tego projektu i nie wspomina wcale o datach.

Idealnie byłbym w stanie zastąpić klasę, której teraz używam (OutlookStorage.cs we wcześniej wspomnianym CodeProject) lub móc nieco zmodyfikować istniejącą klasę. Aby zmodyfikować, potrzebowałbym poprawnego 4-znakowego szesnastkowego identyfikatora dla odebranej daty. Na przykład Temat jest wymieniony jako PR_SUBJECT = "0037", a treść jest wymieniona jako PR_BOY = "1000".

Odpowiedz

2

Wydaje mi się, że biblioteka Aspose zrobi to, co chcesz, wystarczy, że utworzysz bibliotekę innej firmy, więc może nie być to, co chcesz. Istnieje kilka skryptów vbs, które pobierają podstawowe informacje z plików msg, które można przetłumaczyć.

1

Got wskazówkę od 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; 
    } 
} 

Jest to rodzaj hack porównaniu do sposobów można uzyskać inne rzeczy z plików msg użyciu coś to lovely project. Mimo to, jest odporny na wszystko, co rzuciłem przeciwko niemu, i jak zauważyłem, jedyną drogą do zmylenia jest umieszczenie dokładnej do drugiej daty w temacie w odpowiednim formacie.

1

połączyć swoje dwa posty proponuję następujące rozwiązanie:

Aby zmodyfikować, musiałbym prawidłową 4 charakter szesnastkowym prop identyfikator otrzymaliśmy terminie. Na przykład Temat jest oznaczony jako PR_SUBJECT = "0037", a treść jest oznaczona jako PR_BOY = "1000".

Szukaj "007D".

Użyj metody, którą zamieściłeś w swoim drugim poście na odebranych danych, aby wyeliminować problem, gdy ten sam ciąg (data) znajduje się w temacie.


muszę wspomnieć, że metoda ta nie wydaje się pracować na e-maile wewnętrzne: W maili otrzymuję od kolegów, nie ma substg1.0_007Dxxxx-Property.

Tutaj wydaje się, że data jest ukryta w substg1.0_0047xxxx.

Wszystkiego najlepszego!

inno

7

Jeśli używasz OutlookStorage.cs od CodeProject, następnie dodać:

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;     
} 
Powiązane problemy