使用python通过电子邮件发送日期时间

chi*_*yad 6 python datetime

我试图使用python脚本解析电子邮件的日期时间.

在我打开邮件时,邮件日期值如下所示...

from:    abcd@xyz.com
to:      def@xyz.com
date:    Tue, Aug 28, 2012 at 1:19 PM
subject: Subject of that mail
Run Code Online (Sandbox Code Playgroud)

我正在使用代码

mail = email.message_from_string(str1)
#to = re.sub('</br>','',mail["To"])
to = parseaddr(mail.get('To'))[1]
sender = parseaddr(mail.get('From'))[1]
cc_is = parseaddr(mail.get('Cc'))[1]
date = mail["Date"]
print date
Run Code Online (Sandbox Code Playgroud)

使用python解析的相同邮件日期时间的输出如下所示,具有时间偏移.

Tue, 28 Aug 2012 02:49:13 -0500
Run Code Online (Sandbox Code Playgroud)

我在哪里实际上是希望的

Tue, Aug 28, 2012 at 1:19 PM
Run Code Online (Sandbox Code Playgroud)

我对这两个价值观的关系感到很困惑.任何人都可以帮我弄明白我需要同时进入邮件详细信息.

Mar*_*ers 20

查看GMail中的电子邮件时,会在显示发送电子邮件的日期和时间时使用您的本地时区.解析"Tue,2012年8月28日02:49:13 -0500",然后更新到您当地的时区,并以GMail特定的方式格式化.

解析和格式化stdlib方式

email.utils模块包含一个专门处理带有时区偏移的电子邮件标题的parsedate_tz()功能.

它返回一个兼容的元组time.struct_time,但添加了时区偏移量.附加mktime_tz()函数将该元组转换为偏移值(自UNIX纪元以来的秒数).然后可以datetime.datetime()轻松地将该值转换为类型对象.

同样的模块还具有formatdate()功能的UNIX纪元时间戳转换到兼容的电子邮件日期字符串:

>>> from email.utils import parsedate_tz, mktime_tz, formatdate
>>> import time
>>> date = 'Tue, 28 Aug 2012 02:49:13 -0500'
>>> tt = parsedate_tz(date)
>>> timestamp = mktime_tz(tt)
>>> print formatdate(timestamp)
Tue, 28 Aug 2012 07:49:13 -0000
Run Code Online (Sandbox Code Playgroud)

现在我们有一个适合外发电子邮件的格式化日期.要将其打印为我的本地时区(由我的计算机确定),您需要将localtime标志设置为True:

>>> print formatdate(timestamp, True)
Tue, 28 Aug 2012 08:49:13 +0100
Run Code Online (Sandbox Code Playgroud)

使用更好的工具进行解析和格式化

请注意,当我们尝试处理时区时,事情变得毛茸茸,而且formatdate()函数没有给你任何选项来格式化一些不同的东西(比如GMail那样),也不会让你选择一个不同的时区来处理.

进入外部python-dateutil模块 ; 它有一个解析函数,可以处理任何事情,并正确支持时区

>>> import dateutil.parser
>>> dt = dateutil.parser.parse(date)
>>> dt
datetime.datetime(2012, 8, 28, 2, 49, 13, tzinfo=tzoffset(None, -18000))
Run Code Online (Sandbox Code Playgroud)

parse()函数返回一个datetime.datetime()实例,这使格式化更容易.现在我们可以使用该.strftime()函数输出,如您的电子邮件客户端所做的那样:

>>> print dt.strftime('%a, %b %d, %Y at %I:%M %p')
Tue, Aug 28, 2012 at 02:49 AM
Run Code Online (Sandbox Code Playgroud)

当然,那仍然在当地时区; 将其转换为您的时区,使用.astimezone()方法,使用新tzone对象.该python-dateutil套餐对我们来说有些方便.

以下是如何在本地时区(到您的机器)打印它:

>>> import dateutil.tz
>>> print dt.astimezone(dateutil.tz.tzlocal()).strftime('%a, %b %d, %Y at %I:%M %p')
Tue, Aug 28, 2012 at 09:49 AM
Run Code Online (Sandbox Code Playgroud)

或者使用特定的时区代替:

>>> print dt.astimezone(dateutil.tz.tzstr('Asia/Kolkata')).strftime('%a, %b %d, %Y at %I:%M %p')
Tue, Aug 28, 2012 at 07:49 AM
Run Code Online (Sandbox Code Playgroud)


jfs*_*jfs 6

你只能使用stdlib来做到这一点:

>>> from email.utils import parsedate_tz, mktime_tz, formatdate
>>> ts = mktime_tz(parsedate_tz('Tue, 28 Aug 2012 02:49:13 -0500'))
>>> formatdate(ts, localtime=True) # assuming Asia/Kolkata is the local timezone
'Tue, 28 Aug 2012 13:19:13 +0530'
Run Code Online (Sandbox Code Playgroud)

如果您想使用PM格式数小时:

>>> from datetime import datetime
>>> datetime.fromtimestamp(ts).strftime('%a, %b %d, %Y at %I:%M %p')
'Tue, Aug 28, 2012 at 01:19 PM'
Run Code Online (Sandbox Code Playgroud)