如何从Outlook MSG文件中读取接收日期 - 不包括Outlook API?

时间:2009-08-12 14:36:34

标签: outlook metadata email

我需要从Outlook msg文件中读取内容。目前我正在使用CodeProject.com项目中的一个类来完成此任务,因为在服务器上部署VSTO和Outlook不是一种选择。

除了日期信息(例如收到日期和发送日期)之外,此类从msg文件获取To,From,CC,Subject,Body和其他所有内容。

有一些(真的,非常低级别)documentation关于如何从MSDN上的msg文件中获取东西,但它有点超出了这个项目的范围,并没有提到日期。

理想情况下,我可以直接替换我现在使用的类(前面提到的CodeProject中的OutlookStorage.cs),或者能够稍微修改现有的类。要修改,我需要正确的4字符十六进制道具标识符用于接收日期。例如,主题列为PR_SUBJECT = "0037",正文列为PR_BOY = "1000"

4 个答案:

答案 0 :(得分:7)

如果您正在使用CodeProject中的OutlookStorage.cs,请添加以下内容:

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

答案 1 :(得分:2)

我认为Aspose库会做你想要的,确定它是第三方库,所以可能不是你想要的。有几个vbs脚本可以从可以翻译的msg文件中获取基本信息。

答案 2 :(得分:1)

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

与使用lovely project内容从msg文件中获取其他内容的方式相比,这是一种黑客行为。尽管如此,它仍然坚持我所抛出的所有东西,并且正如所指出的那样 - 愚弄它的方法是以正确的格式在主题行中准确地说出第二个日期。

答案 3 :(得分:1)

结合你的两个帖子我会建议以下解决方案:

  

要修改,我需要正确的4字符十六进制道具标识符作为收到的日期。例如,Subject列为PR_SUBJECT =“0037”,Body列为PR_BOY =“1000”。

寻找“007D”。

使用您在第二篇文章中发布的方法接收数据,以便在主题内有相同(日期)字符串时消除问题。


我必须提一下,这种方法似乎不适用于内部电子邮件:在我从同事那里收到的邮件中,没有substg1.0_007Dxxxx-Property。

此处,日期似乎隐藏在substg1.0_0047xxxx中。

一切顺利!

INNO