2009-08-12 26 views
6

tengo que leer las cosas desde un archivo MSG de Outlook. Actualmente estoy usando una clase de CodeProject.com proyecto para lograr esto, ya que el despliegue de VSTO y Outlook en el servidor no es una opción.¿Cómo leo la Fecha de recepción de los archivos MSG de Outlook sin la API de Outlook?

Esta clase obtiene A, De, CC, Asunto, Cuerpo, y todo lo demás que necesito desde el archivo msg, excepto la información de la fecha (como Fecha recibidos y enviados Fecha).

Hay algunos (realmente, muy bajo nivel) documentation sobre cómo sacar cosas de los archivos msg en MSDN, pero está un poco fuera del alcance de este proyecto y no menciona las fechas.

Idealmente podría tener un reemplazo directo para la clase que estoy usando ahora (OutlookStorage.cs en el CodeProject previamente mencionado) o poder modificar un poco la clase existente. Para modificar, necesitaría el identificador de apuntador hexidecimal correcto de 4 caracteres para la fecha de recepción. Por ejemplo, Subject se enumera como PR_SUBJECT = "0037" y Body se enumera como PR_BOY = "1000".

Respuesta

2

creo que la biblioteca Aspose va a hacer lo que quiere, bien sea un tercio lib partido por lo que no puede ser lo que quiera. Hay algunos scripts vbs que obtienen información básica de los archivos msg que pueden traducirse.

1

tenía la sensación de 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; 
    } 
} 

Esta es una especie de truco en comparación con las formas de obtener otras cosas de archivos MSG usando algo tan lovely project. Aún así, es puso de pie para todo lo que he lanzado contra ella, y como se ha señalado el camino para engañar -only- que es poner la fecha exacta a la segunda en la línea de asunto en el formato adecuado.

1

de combinar sus dos puestos que sugeriría la siguiente solución:

Para modificar, necesitaría el carácter correcto 4 hexadecimal identificador para apuntalar fecha de recibido. Por ejemplo, Subject se enumera como PR_SUBJECT = "0037" y Body se enumera como PR_BOY = "1000".

Busque "007D".

Utilice el método que ha escrito en su segundo puesto en los datos recibidos para eliminar el problema cuando la misma (fecha) de cadena está dentro de la materia.


tengo que mencionar que no parece que este método funcione en los correos electrónicos internos: En mails que recibo de los colegas, no hay substg1.0_007Dxxxx-propiedad.

Aquí, la fecha parece estar oculta en el substg1.0_0047xxxx.

¡Todo lo mejor!

Inno

7

Si está utilizando OutlookStorage.cs de CodeProject, a continuación, añadir lo siguiente:

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;     
} 
Cuestiones relacionadas