如何在没有Outlook API的情况下从Outlook MSG文件读取收到的日期?

如何在没有Outlook API的情况下从Outlook MSG文件读取收到的日期?,outlook,metadata,email,Outlook,Metadata,Email,我需要从Outlook msg文件中读取内容。目前,我正在使用project中的一个类来完成此任务,因为在服务器上部署VSTO和Outlook不是一个选项 这个类从msg文件中获取toto、From、CC、Subject、Body以及我需要的所有其他内容,除了日期信息(例如接收日期和发送日期) 关于如何从MSDN上的msg文件中获取内容,有一些(非常、非常低级的)内容,但它有点超出了这个项目的范围,并且根本没有提到日期 理想情况下,我能够为我现在使用的类(前面提到的CodeProject中的Ou

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

这个类从msg文件中获取toto、From、CC、Subject、Body以及我需要的所有其他内容,除了日期信息(例如接收日期和发送日期)

关于如何从MSDN上的msg文件中获取内容,有一些(非常、非常低级的)内容,但它有点超出了这个项目的范围,并且根本没有提到日期

理想情况下,我能够为我现在使用的类(前面提到的CodeProject中的OutlookStorage.cs)提供一个临时替换,或者能够稍微修改现有的类。要修改,我需要接收日期的正确的4字符十六进制道具标识符。例如,主题被列为
PR_Subject=“0037”
,主体被列为
PR_BOY=“1000”

得到以下提示:

string fullFileName=“c:\message.msg”;
DateTime dateRevieved=新的日期时间();
StreamReader sr=新的StreamReader(fullFileName,Encoding.Default);
字符串已满=sr.ReadToEnd();
字符串日期;
int iStart;
国际劳工组织;
字符串标题;
//这-应该-处理所有类型的螺丝
//唯一不可能的办法是,如果有人猜到了-确切的-第二个
//在他们发送信息的时候,以正确的格式将其放入主题中
虽然(真的){//不是无限循环,我发誓!
caption=“日期:”;
如果(full.IndexOf(“Date:”)>-1){//full随每个日期缩短,则删除
字符串temp=“”;
iStart=full.LastIndexOf(标题);
温度=完全移除(0,iStart+标题长度);
full=full.子字符串(0,iStart);
iLast=temp.IndexOf(“\r\n”);
如果(iLast<0){
日期=温度;
}否则{
日期=临时子字符串(0,iLast);
}
date=date.Trim();
if(日期包含(主题)| |主题包含(日期)){
continue;//只有在有人想欺骗我时才会发生
}
试一试{
dateRevieved=DateTime.Parse(date);//如果不是日期,则将失败
break;//如果不是,则日期从while循环中断
}抓住{
continue;//尝试使用较小的msg子集
}
}否则{
打破
}
}

与使用这种方法从msg文件中获取其他内容相比,这是一种黑客行为。尽管如此,它经受住了我对它提出的一切挑战,正如我所指出的那样,愚弄它的唯一方法是在主题行中以适当的格式将确切日期放在第二天。

我认为该库会做你想做的,好吧,它是一个第三方库,因此可能不是你想要的。有一些vbs脚本可以从可以翻译的msg文件中获取基本信息。

要结合您的两篇文章,我建议以下解决方案:

要修改,我需要接收日期的正确的4字符十六进制道具标识符。例如,主体列为PR_Subject=“0037”,主体列为PR_BOY=“1000”

查找“007D”

使用您在第二篇文章中对接收到的数据发布的方法来消除主题中存在相同(日期)字符串时的问题


我必须指出,这种方法似乎不适用于内部电子邮件:在我从同事那里收到的邮件中,没有subsg1.0_007dxxx-Property

在这里,日期似乎隐藏在subsg1.0_0047xxxx中

祝你一切顺利


inno

如果您正在使用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;                
}
private const string PR_RECEIVED_DATE=“007D”;
私有常量字符串PR_已接收日期_2=“0047”;
...
/// 
///获取收到消息的日期。
/// 
公共日期时间接收日期
{
得到
{
if(_dateRevieved==DateTime.MinValue)
{
string dateMess=this.getMapPropertyString(OutlookStorage.PR\u RECEIVED\u DATE);
if(String.IsNullOrEmpty(dateMess))
{
dateMess=this.GetMapPropertyString(OutlookStorage.PR_RECEIVED_DATE_2);
}
_dateRevieved=提取日期(dateMess);
}
返回日期已修改;
//返回日期(dateMess);
}
}
private DateTime\u dateRevieved=DateTime.MinValue;
私有日期时间提取日期(字符串dateMess)
{
字符串matchStr=“日期:”;
string[]lines=dateMess.Split(新字符串[]{“\r\n”},StringSplitOptions.RemoveEmptyEntries);
foreach(行中的字符串行)
{
if(行起始带(匹配字符串))
{
字符串dateStr=line.Substring(matchStr.Length);
日期时间响应;
if(DateTime.TryParse(dateStr,out响应))
{
返回响应;
}
}
}
return DateTime.MinValue;
}
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;                
}