Maildir - 打开最近的电子邮件并回复发件人

Maildir - open latest email and reply to sender

我已经使用 .forward 文件在电子邮件服务器上配置了 postfix,该文件保存电子邮件副本并调用 python 脚本。这些电子邮件以 Maildir 格式存储。

我想使用此 Python 脚本向发件人发送回复,确认已收到电子邮件。我想知道是否有任何方法可以 open/access e-mail,获取 header 信息和发件人地址并发回电子邮件。

我查看了 Python 的几个 Maildir 函数示例,但它们大多是 add/delete e-mail。如何打开在Maildir/new收到的最新e-mail并获取所需信息?

目前我的程序:

md =  mailbox.Maildir('/home/abcd/Maildir')
message = md.iterkeys().next()
#print message
#for msg in md:
#    subject = msg.get('Subject',"")
#    print subject
print message
sender = message.get('From',"")
print sender

当我执行这个时,我确实得到了发件人姓名。但这是最旧的电子邮件到达 Maildir/new 文件夹而不是最新的。

此外,如果我使用 get_date 功能,如果两个(或更多)e-mail 同一天到达怎么办?

对此的一些提示:

  • 您可以使用 mailbox.Maildir class 打开 Maildir(请参阅邮箱文档)
  • 您可以通过方法 itervalues
  • 遍历 Maildir 中的所有邮件
  • 现在你得到了 Maildir 中的所有邮件。其中之一是最近的。
  • 邮件是 class MaildirMessage 的对象,它是 Message 的子class。对于这些 classes,还存在文档(当前与邮箱位于同一页面上)
  • 通过对那些对象的方法"get_date",你可以找出哪一个是最近的。你还是得自己select。

初学者的帮助就这么多:一点点你自己也应该做。

您应该熟悉 Python 文档 - 我同意,找到正确的包以及如何使用它们并不容易,但您可以直接在 Python shell.

好的,这是另一个代码片段:

newest = None
for message in md.itervalues():
   if newest == None or message.get_date() > newest.get_date():
      newest = message
# now newest should contain the newest message

没看到你的最后一个问题:get_date 不仅包含日期,还包含时间,因为它给出了自(通常)1970 年以来的秒数。

MaildirMessage 的方法 .get_date() 获取时间戳 光盘上的消息文件。根据您的文件系统,这可能具有两秒和纳秒之间的任何精度。 .get_date() 给出相同值的两条消息的变化比实际仅 returned 一个日期时要小得多。

然而,如果消息文件由于某种原因被触及,来自 .get_date() 的 return 将根本不相关。鸽舍例如明确指出不应更改文件 mtime。

有多个日期与 MaildirMessage 关联:

  1. 消息名称中编码的到达时间戳(第一个点之前的部分,这些是“整”秒)。如果部分 在第一个和第二个点之间有一个 Mn 形式的段,而不是 n 是微秒到达时间,用于提高时间戳的分辨率。
  2. 光盘上文件的时间戳
  3. 发送程序设置的'Date:'header字段(或由某些程序添加 MTA)
  4. 中间 MTA 在 'Received:' header 字段中添加的日期

最后一项可能不可用,例如如果您和发件人在同一台邮件服务器上。第三个很容易 faked/incorrect(您的收件箱中是否曾收到多年前的垃圾邮件?)。如果文件被触及,第二个是不正确的。

剩下 selecting 第一个选项:

d = {}
for name in md.keys():
    d.setdefault(int(name.split('.', 1)[0]), []).append(name)
result = sorted(d.items())[-1][1]
assert len(result) == 1  # might fail
msg = md.get_message(result[0])

如果幸运的话 result 是一个包含单个项目的列表。但是这个值只有第二个分辨率,所以你可能有多个电子邮件,然后你必须决定如何根据其他值之一决定要 select 的消息(例如,通过使用文件时间戳 [=12 排序) =]) 或者只是 select 第一个,随机 select 个。 (如果您有日志文件,您可以在其中搜索 result 消息的键以确定最晚到达的消息)。

如果您不转换为 int,并且有旧电子邮件(即 2001-09-09 之前 03:46:40),则字符串比较可能不会为您提供最新到达的消息时间。