0

这个原本有效的方法会导致邮件客户端将“接收”时间误解为快 5 小时。这是唯一使用的配方。在比较写入两个标题的日期/时间时,基本上没有区别。有什么好的解决方法?食谱可以弥补吗?

LOGFILE=$HOME/proclog
VERBOSE=YES 

# prevent qmail (the program that is calling procmail 
# as a filter) from delivering the original mail.

EXITCODE=99 

MAILDIR=$HOME/boxes/mydomain.com
INBOX=$MAILDIR/bob
GREY=$MAILDIR/bob^/.imap/grey
JUNK=$MAILDIR/bob^/.imap/Junk
TEST=$MAILDIR/bob^/.imap/Test 

:0
* ^Subject:.*test
${TEST}

# Spam level < 2.0: it's probably real email, deliver as normal 
:0
${INBOX}

以下是下午 4:05 发送的电子邮件的标题,但在桌面电子邮件客户端和 iOS 上显示是在晚上 9:05 收到的。

Return-Path: <from_email@domain.com>
Delivered-To: username-domain:com-bob@domain.com
X-Envelope-To: bob@domain.com
Received: (qmail 16283 invoked from network); 29 Jan 2015 00:05:59 -0000
Received: from mailwash46.pair.com (IP ADDRESS)
  by tanha.pair.com with SMTP; 29 Jan 2015 00:05:59 -0000
Received: from localhost (localhost [127.0.0.1])
    by mailwash46.pair.com (Postfix) with SMTP id 31958EBC17
    for <bob@domain.com>; Wed, 28 Jan 2015 19:05:59 -0500 (EST)
Received: from tanha.pair.com (tanha.pair.com [IP ADDRESS])
    by mailwash46.pair.com (Postfix) with ESMTP id 0E9EBEBFB5
    for <bob@domain.com>; Wed, 28 Jan 2015 19:05:59 -0500 (EST)
Received: from [192.168.1.230] (c-IP ADDRESS.hsd1.wa.comcast.net [IP ADDRESS])
    by tanha.pair.com (Postfix) with ESMTPSA id BE211F1D10
    for <bob@domain.com>; Wed, 28 Jan 2015 19:05:58 -0500 (EST)
User-Agent: Microsoft-Entourage/12.20.0.xxxx
Date: Wed, 28 Jan 2015 16:05:57 -0800
Subject: 405pm test
From: "Robert" <from_email@domain.com>
To: "bob@domain.com" <bob@domain.com>
Message-ID: <D0EEB965.49C7D%from_email@domain.com>
Thread-Topic: 405pm test
Thread-Index: AdA7V1sU8z5udBOZSUyJx4az1tpIXA==
Mime-version: 1.0
Content-type: multipart/alternative;
    boundary="B_3505305958_xxxxxx"

还有一封显示正确时间的电子邮件(基本相同):

Return-Path: <from_email@domain.com>
Delivered-To: username-domain:com-bob@domain.com
X-Envelope-To: bob@domain.com
Received: (qmail 22574 invoked from network); 30 Jan 2015 02:35:23 -0000
Received: from mailwash46.pair.com (IP ADDRESS)
  by tanha.pair.com with SMTP; 30 Jan 2015 02:35:23 -0000
Received: from localhost (localhost [127.0.0.1])
    by mailwash46.pair.com (Postfix) with SMTP id 4CF3BEBF9D
    for <bob@domain.com>; Thu, 29 Jan 2015 21:35:23 -0500 (EST)
Received: from tanha.pair.com (tanha.pair.com [IP ADDRESS])
    by mailwash46.pair.com (Postfix) with ESMTP id 4C278EBF97
    for <bob@domain.com>; Thu, 29 Jan 2015 21:35:23 -0500 (EST)
Received: from [192.168.1.230] (c-IP ADDRESS.hsd1.wa.comcast.net [IP ADDRESS])
    by tanha.pair.com (Postfix) with ESMTPSA id 55E98F1BF8
    for <bob@domain.com>; Thu, 29 Jan 2015 21:35:21 -0500 (EST)
User-Agent: Microsoft-Entourage/12.20.0.xxxxxxxx
Date: Thu, 29 Jan 2015 18:35:16 -0800
Subject: test
From: "Robert." <from_email@domain.com>
To: "bob@domain.com" <bob@domain.com>
Message-ID: <D0F02DE4.49D82%from_email@domain.com>
Thread-Topic: test
Thread-Index: AdA8NWF58VbsQ1XhgkuMBHgxsaYksg==
Mime-version: 1.0
Content-type: multipart/alternative;
    boundary="B_3505401322_xxxxxxxx"
4

2 回答 2

0

我发布了第二个答案,以从 Procmail 的角度解决 IMAP 服务器端的猜测。

如果 Qmail 在发送到您的收件箱时做了一些特别的事情,您需要从您的 Procmail 食谱中做同样的事情。所以你在哪里

:0
$INBOX

你应该有

:0
| whatever it is that qmail is doing to deliver into "$INBOX"

很抱歉,我不能更具体地说明应该在管道中做什么。根据 IMAP 服务器,您可以查找Dovecot、 Courier (但似乎更喜欢maildropprocmailCyrus等的流行交付操作;或者只是查看您的 ISP 的 Qmail 配置,看看它在做什么。

于 2015-01-30T07:09:57.880 回答
0

我试图寻找“接收日期”的正确规范,但找不到任何规范。但是,我偶然发现了https://bugzilla.mozilla.org/show_bug.cgi?id=402594,它在两行之间表明邮件客户端实际上正在解析Received:这些信息的标题。现在,问题仍然存在,Received:他们查看哪个标头,在您的问题案例中这个标头有什么问题?那里没有任何内容专门转换为 21:05(IMAP 客户端显示的时间戳的精确副本将便于诊断),因此这完全是推测性的 - 但如果您能提出更好的推测,请参阅至少我可以向您展示如何解决如何替换标题中的某些内容的技术问题。

我假设我们应该查看最顶部的Received:标题并将其时区标准化为您希望看到的任何内容(这似乎是 -0800 PST)。

TZ="America/Los_Angeles"
:0fhW
* ^Received:[   ]*from[         ]*.*($[         ].*)*; \
        ()\/(Mon|T(ue|hu)|Wed|Fri|S(at|un)), \
        [0-3 ][0-9] (A(pr|ug)|Dec|Feb|J(an|u[nl])|Ma[ry]|Oct|Sep) \
        20[1-9][0-9] [0-2][0-9]:[0-5][0-9]:[0-6][0-9] [-+][01][0-9][0134][05] \
        \([A-Z]+T\)
| d=`date -R -d "$MATCH"`; sed "s/$MATCH/$d/"

现在,这显然相当脆弱,但至少粗略地向您展示了如何做到这一点。对于更可移植和更健壮的方法,我可能会将其放入外部脚本(Python、Perl、你有什么)而不是在 Procmail 和 shell 脚本中编码。(当然,您仍然可以从 Procmail 运行它——我只需制作一个脚本,该脚本可以在您收到的所有电子邮件上运行,它只会修改需要更改的电子邮件。)

这会从第一个匹配的标头中提取日期戳(也许您应该将其调整为仅匹配 -0500 时区?)并将该特定日期字符串上的任何匹配替换为新的匹配,该匹配是通过调用date -R -d捕获的日期生成的作为参数,它将其转换为正在运行的任何时区(我们使用TZ变量赋值设置 - 这是一个棘手的巫术,我永远记不起数字时区的正确语法,所以我只是查找了一个通用名称-0800)。

日期戳正则表达式是临时的,但我似乎至少记得一个月中的个位数天的空间与零填充以及闰秒和时区,它们与 UTC 的偶数小时不同。我敢肯定,我仍然缺少一些细节,或者只是愚蠢的想法。

还有一个我忽略的更顶层的(qmail xxx invoked from network)标题 - 它具有不同的非 RFC822 格式的时间戳,所以我猜你的 IMAP 客户端也会忽略它。

\/正则表达式捕获标记之前古怪的空括号是因为 Procmail在涉及行首的反斜杠时很古怪

于 2015-01-30T05:39:27.277 回答