电子邮件"日期"标题应该是发件人的当地时间还是UTC?

kuh*_*nza 15 python email rfc2822

我正在用Python编写一个基于Web的电子邮件客户端,并且出现了一个问题,即电子邮件的"Date"标题应该在发送时表示哪个时区.

RFC 2822在3.3节中指出:

日期和时间应该表达当地时间.

这对我来说似乎含糊不清; 问题是当地时间是谁?电子邮件服务器或发件人?当然,我会假设发件人(可以在任何时区,并且可以更改其帐户首选项).当我看到Python的email.utils.formatdate函数时出现了进一步的混乱,它似乎只提供两种选择:UTC或本地时间(服务器的).对我来说似乎没有任何指定备用时区的选项,或者我错过了什么?

使用time.mktime(senders_tz_aware_now_datetime.timetuple())UTC日期字符串中的结果将时间值传递给formatdate ,考虑到RFC上面提到的内容,这会感觉不对.

那么哪个时区应该是"Date",并且是否存在任何标准函数来创建适当的日期字符串?

spi*_*lok 8

如果您想遵守RFC,则传递localtime=True返回带有本地时间和正确时区的日期字符串(假设您已正确设置).

>>> email.utils.formatdate(localtime=True)
'Mon, 07 May 2012 12:09:16 -0700'
Run Code Online (Sandbox Code Playgroud)

如果没有localtime=True您获得表示UTC时间的日期字符串:

>>> email.utils.formatdate()
'Mon, 07 May 2012 19:08:55 -0000'
Run Code Online (Sandbox Code Playgroud)

-0000显然表示UTC,尽管RFC特别推荐使用+0000.不确定这是否是email.utils中的错误.

这是相关的python文档:

可选的localtime是一个标志,当为True时,解释timeval,并返回相对于本地时区而不是UTC的日期,正确考虑夏令时.默认值为False,表示使用UTC.

  • 只要您生成表示发送电子邮件的时间的一致时间戳,发件人所处的时区就没有关系.由接收者的客户端正确解释它.这就是为什么@Sorin建议使用UTC,这是最简单的方法. (2认同)

sor*_*rin 4

只需使用 UTC,您就会更开心。

这就是当规范使用“应该”这样的术语时所发生的情况。我认为这两者都应该被禁止出现在规范中,因为它们总是会产生不必要的复杂性。

使用 UTC 是完全有效的。

  • 我改变主意了,走简单的路吧,晚上你就有时间喝啤酒了。 (2认同)
  • 哈哈我喜欢你的风格。尽管如此,我还是想了解一下通常如何处理这个问题,因为我想它会对一系列我从未听说过的电子邮件客户端产生影响,更不用说拥有时间或资源来测试了。 (2认同)