Plone MailHost 使用澳大利亚时区发送错误的日期标头



我有一个为悉尼用户运行的 Plone 实例,因此 TZ 环境变量设置为 Australia/Sydney 。使用此集合,使用 Zope2 中的 DateTime 模块的代码将生成显示错误时区的结果。例如:

>>> import time
>>> import DateTime
>>> print time.strftime("%a, %d %b %Y %T %z") # 
Thu, 20 Sep 2012 02:38:08 +1000
>>> print DateTime.DateTime().rfc822()
Thu, 20 Sep 2012 02:38:08 -0400

这是相当有问题的,因为Products.MailHost将传出电子邮件上的Date:标头设置为值DateTime().rfc822()(在 MailHost.py 的第 466 行)。由于偏移量错误,因此 Date 标头中的时间现在是未来 12 小时。接收该电子邮件的SMTP服务器通常会立即拒绝它!

同一实例中的其他代码使用该 TZ 变量的行为非常愉快,因为它使用 Python 中的 datetime 模块,该模块都基于 libc 的time.h函数。

那么,人们如何才能让Plone的MailHost在澳大利亚时区工作呢?

不幸的是,TZ=Australia/Sydney变得time.tzname == ('EST', 'EST')

$ TZ=Australia/Sydney bin/zopepy -c "import time; print time.tzname"
('EST', 'EST')

DateTime内部数据库将其转换为US/Eastern。这是东部标准时间是多个时区名称的不幸副作用。

您需要指定一个更明确的TZ变量,指定偏移量和 DST 切换日期,并使用不会被误解的新时区名称:

TZ="AEST-10AEDT-11,M10.1.0/02:00:00,M4.1.0/03:00:00"

上面的值来自仍然打开的错误报告,恰好非常适合您的目的:

$ TZ="AEST-10AEDT-11,M10.1.0/02:00:00,M4.1.0/03:00:00" bin/zopepy
>>> import DateTime
>>> import sys
>>> m = sys.modules['DateTime.DateTime']
>>> m._findLocalTimeZoneName(0)
'GMT+10'
>>> m._findLocalTimeZoneName(1)
'GMT+11'
>>> import DateTime
>>> DateTime.DateTime()
DateTime('2012/09/21 00:12:0.765691 GMT+10')
>>> DateTime.DateTime().rfc822()
'Fri, 21 Sep 2012 00:12:04 +1000'

您可以通过在构建中分隔 TZ 环境变量来将它添加到 Zope 配置中:

[instance]
recipe = plone.recipe.zope2instance
...
environment-vars =
    TZ AEST-10AEDT-11,M10.1.0/02:00:00,M4.1.0/03:00:00

相关内容

  • 没有找到相关文章

最新更新