0

我正在寻找一种方法在 Sieve 中做一些我多年来在 Procmail 中一直在做的事情,即在传入的消息中插入一个明确的日期标题,这让我很清楚 - 独立于埋藏的“收到”标题可能有多个服务器,但是我的邮件客户端会解释消息的发送日期——我的服务器收到消息的时间。这就是我在 Procmail 中的做法:

# First create the "date_received" variable for my time zone:
date_received=`/bin/date -ud '+2 hour' +'%A %Y-%m-%d %H:%M:%S +0200'`

# Second, insert the header containing the date_received variable:
:0 fh w
| formail -i "X-Local-Date-Received: $date_received"

我发现“addheader”(RFC 5293)显然会添加一个标题,但由于我读过的其他内容(对不起,不记得在哪里)我相信 Sieve 不会在 shell 中运行“date”命令由于限制或出于安全原因不运行 shell 命令的预期(和可理解的)偏好。

其他可能有用的信息:我正在通过 Roundcube 1.3.6 执行此操作,但我有一种感觉(也是由于我阅读的内容),如果我在 Roundcube 中编辑原始代码,Roundcube 可能会覆盖自定义筛选器集。如有必要,我很乐意直接在服务器上编辑或创建 Sieve 配置文件,以便为服务器上的所有用户实现这一点,但多年来我一直运行 Sendmail 和 Procmail,我不确定执行此操作的最佳位置。

编辑:

作为 Roundcube 中的一个测试,我在我的 Sieve 过滤器组的顶部添加了这个:

require ["fileinto","editheader"];
# rule:[test editheader]
if true
{
addheader "X-Test-Header" "This is a test header.";
}

我实际上并没有添加行“require [”fileinto“”editheader“];”; 我刚刚在过滤器集顶部的现有行中添加了“editheader”,如下所示:

require ["copy","fileinto","regex","editheader"];

我希望这会增加...

X-Test-Header: This is a test header.

...对于每条传入的消息,但 Roundcube 不会让我保存它:

An error occurred.
Unable to save filter. Server error occurred.

Roundcube 错误编辑筛滤器集。

搜索此错误会返回一个相关结果,但未发布解决方案。

但是,我不打算专注于 Roundcube。就像我之前说的,如有必要,我将从命令行添加这个 Sieve 过滤器。

4

3 回答 3

1

这是我的筛子脚本,它转换ReceivedDate

require "editheader";
require "regex";
require "variables";

if not exists "Date" { 
    if header :regex "Received" "^from[[:space:]]+.*[[:space:]]+by[[:space:]]+mail.mydomain.com[[:space:]]+with[[:space:]]+.*[[:space:]]+for[[:space:]]+.*;(.*)$" {
        addheader :last "Date" "${1}";
    }
}

请注意,它mail.mydomain.com是实际邮件服务器地址的替代,这意味着它仅在特定邮件服务器上接收到邮件时才匹配标头。我使用 dovecot-2.3.5.1 完成了这项工作

于 2019-04-07T22:32:21.100 回答
1

Pigeonhole Sieve Editheader 扩展默认不可用。根据其文档,您需要确保将其添加到服务器上的筛子扩展列表中:

plugin {
  # Use editheader
  sieve_extensions = +editheader
}

如果您想像使用 procmail 一样在 Dovecot 上使用 sieve 运行任意脚本,那么您可以使用其外部程序插件,在 Dovecot 中配置您希望允许用户使用的外部程序,然后用户可以使用“vnd. dovecot.execute”扩展名来运行这些程序。您也许可以使用它来移植您在 procmail 中使用的任何脚本。

在一般情况下,sieve 的目的是让用户能够配置自己的邮件过滤,而您似乎正在尝试为服务器实际做一些全局性的事情。Dovecot 应该在处理邮件时添加自己的 Received 标头,这是在邮件系统收到消息时标记的标准方法,所以我不清楚你为什么不只是使用它,或者你想要进行哪些更改为其默认行为。您想要做的事情可能会在您的邮件传输代理中处理得更好,而不是在您的邮件递送代理中处理。

于 2018-10-04T12:56:10.587 回答
0

你可以使用date插件。请参阅:rfc5260

require "date";
require "editheader";

if currentdate :matches "std11" "*" {
    addheader :last "X-Local-Date-Received" "${1}";
}
于 2022-03-03T09:38:12.260 回答