You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MsgKit转EML为MSG后Outlook预览无接收日期问题咨询

解决MsgKit转换EML到MSG后Outlook预览接收日期显示“None”的问题

我之前踩过一模一样的坑——用MsgKit转EML到MSG后,文件结构和在线转换的几乎一致,但Outlook预览就是显示接收日期为“None”。后来才搞明白:Outlook在预览MSG文件时,读取接收日期的逻辑并不是看单一属性,而是优先校验几个核心的MAPI属性,MsgKit默认的映射逻辑可能没把EML的Date头正确同步到这些关键字段上。

关键:Outlook预览依赖的接收日期属性

Outlook在预览窗格中读取接收日期时,会按以下优先级查找属性:

  1. PR_MESSAGE_DELIVERY_TIME (0x0E060040):这是优先级最高的交付时间属性,Outlook预览会直接读取这个字段的值
  2. PR_CLIENT_SUBMIT_TIME (0x00390040):如果上面的属性未设置,Outlook会 fallback 到邮件提交时间
  3. PR_CREATION_TIME (0x00300040):如果前两个都缺失,才会尝试用创建时间,但这时候预览显示可能仍异常

你之前尝试用msg_parser里的属性但没解决,大概率是因为只设置了部分属性,或者没有把EML的Date头正确转换并写入到优先级最高的PR_MESSAGE_DELIVERY_TIME中。

MsgKit的正确设置方法

核心是把EML的Date头(带时区)转换成正确的DateTime值,然后手动写入上述MAPI属性,而不只是依赖MsgKit的Message.Date属性(这个属性可能只映射到了非预览用的字段)。

示例代码如下:

// 解析EML中的Date头(你的例子里是"Thu, 30 Jan 2020 12:09:26 +0530")
var emlDateHeader = "Thu, 30 Jan 2020 12:09:26 +0530";
if (DateTimeOffset.TryParse(emlDateHeader, out var deliveryTime))
{
    using (var msg = new Message("sender@domain.com", "recipient@domain.com", "邮件主题", "邮件内容"))
    {
        // 基础设置:MsgKit的默认Date属性
        msg.Date = deliveryTime.UtcDateTime;
        
        // 关键步骤:手动设置Outlook预览依赖的核心MAPI属性
        msg.SetProperty(MapiPropertyTag.PR_MESSAGE_DELIVERY_TIME, deliveryTime.UtcDateTime);
        msg.SetProperty(MapiPropertyTag.PR_CLIENT_SUBMIT_TIME, deliveryTime.UtcDateTime);
        msg.SetProperty(MapiPropertyTag.PR_CREATION_TIME, deliveryTime.UtcDateTime);
        
        // 保存转换后的MSG文件
        msg.Save(@"C:\converted.msg");
    }
}

验证方法

用OLE复合查看器对比你转换的MSG和在线转换的MSG,重点检查上述三个属性的存在性和值是否一致。如果在线转换的MSG里有PR_MESSAGE_DELIVERY_TIME而你的没有,那就是问题所在——补上这个属性后,Outlook预览就能正常显示接收日期了。

内容的提问来源于stack exchange,提问作者aravind_reddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:12:42