我正在尝试获取.msg
电子邮件文件的发送日期。经过无休止的搜索,我得出的结论是,发送日期未保留在文件中自己的流中(但是,如果我输入有误,请更正我)。相反,似乎必须从包含标准电子邮件标题的流(名为__substg1.0_007D001F
的流)中获取日期。
因此,我设法获得了电子邮件 header 流并将其存储在缓冲区中。此时,我需要从头文件中查找并解析Date
字段。我发现这很困难,因为我不相信可以使用标准的电子邮件解析C++库。毕竟,我只有标题流,而没有完整的标准电子邮件文件。
我目前正在尝试使用正则表达式,也许是这样的:
std::wregex regexDate(L"^Date:(.*)\r\n");
std::wsmatch match;
if (std::regex_search(strHeader, match, regexDate)) {
//...
}
但是我不愿意使用正则表达式(我担心它会容易出错),并且我想知道是否有更健壮的,可接受的解析 header 的方法。也许在新行上分割标题字符串并找到以
Date:
开头的字符串?任何指导将不胜感激。另一个注意事项:我不确定是否可以逐行读取 header 流,因为
IStream
没有get line方法。(旁注:我也尝试过使用C++ Outlook自动化获取消息数据,但这似乎涉及一些安全性和兼容性问题,因此无法解决。)
最佳答案
发送日期存储在msg文件中,但请注意,它不在自己的流中。作为简短的固定宽度值,可以在__properties_version1.0流对象的根条目下(或嵌入式消息的附件对象下)找到,其属性ID为0x00390040 the PidTagClientSubmitTime Property,在MS- OXOMSG文档为
Contains the current time, in UTC, when the email message is submitted.
MS-OXCMAIL Section 2.2.3.2.2: Sent time详细说明了这一点:
To set the value of the PidTagClientSubmitTime property ([MS-OXOMSG] section 2.2.3.11), clients MUST set the Date header value, as specified in [RFC2822].
该属性类型为0x0040,pTypTime,根据Property Data Types列表:
8 bytes; a 64-bit integer representing the number of 100-nanosecond intervals since January 1, 1601
关于c++ - 从.msg文件的 header 流中解析日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58049225/