我需要从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"
。
答案 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