Laravel IMAP获取的邮件日期与邮箱显示不一致,求解决方案
问题:Laravel IMAP扩展获取的邮件日期与邮箱显示不一致
我正在使用Laravel IMAP扩展,通过以下两种方式获取邮件日期:
$message->getDate()->toDate();
或
$message->date->toArray()[0]->toArray()['formatted'];
问题在于,通过IMAP获取的日期与邮箱中显示的日期不一致。例如,邮箱中显示的邮件日期为2022-09-12 11:45,但我获取到的是:
["date"]=> string(26) "2022-09-12 15:45:34.000000" ["timezone_type"]=> int(1) ["timezone"]=> string(6) "+00:00" }
我尝试使用纯PHP IMAP也得到了相同的结果。由于我需要从不同时区的邮箱获取邮件,无法提前预知需要从UTC转换到哪个时区,请问有没有办法获取邮箱中显示的真实日期?
解决方案
IMAP协议返回的邮件日期默认是UTC时区的时间,而邮箱显示的日期一般是基于邮件发送时的原始时区或邮箱用户设置的本地时区转换后的结果。要获取和邮箱一致的日期,最可靠的方式是利用邮件本身的头信息:
- 解析邮件原始
Date头字段
邮件的Date头字段会包含发送时的完整时区信息(比如格式类似Mon, 12 Sep 2022 11:45:34 +0400),直接解析这个字段就能得到和邮箱显示一致的时间:
// 获取邮件原始Date头 $rawDate = $message->getHeader('Date'); // 解析带时区的日期字符串 $date = DateTime::createFromFormat('D, d M Y H:i:s O', $rawDate); // 按需要格式化输出 echo $date->format('Y-m-d H:i');
- 备选:获取邮箱账户时区(依赖服务器支持)
如果邮件服务器支持账户配置查询(比如Exchange或部分支持扩展指令的服务器),可以尝试获取邮箱用户设置的本地时区。但这种方式通用性较差,仅作为补充方案。
总结:解析邮件原始Date头是最通用、可靠的方法,因为邮箱显示的日期正是基于这个包含时区信息的原始字段转换而来的。
内容的提问来源于stack exchange,提问作者Emily Carter
相关产品推荐
相关产品推荐

