使用Sieve

时间:2018-09-10 01:19:18

标签: email sieve-language

我正在寻找一种在筛网中做某事的方法,这是我多年来在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命令的限制(或出于可理解的优先)而在shell中添加了“ date”命令。

其他可能有用的信息:我正在通过Roundcube 1.3.6进行此操作,但是我有一种感觉(also due to something I read),如果我在Roundcube中编辑原始代码,则Roundcube可能会覆盖自定义的Sieve过滤器集。如有必要,我很乐意直接在服务器上编辑或创建Sieve配置文件以为服务器上的所有用户实现此目的,但是已经运行Sendmail和Procmail多年了,我不确定这样做的最佳位置。 / p>

编辑:

作为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 error editing Sieve filter set.

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

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

2 个答案:

答案 0 :(得分:0)

“ Pigeonhole筛孔编辑头”扩展程序默认情况下不可用。对于its documentation,您需要确保已将其添加到服务器上的筛分机扩展列表中:

plugin {
  # Use editheader
  sieve_extensions = +editheader
}

如果您希望像在procmail中一样在Dovecot上使用筛子运行任意脚本,则可以使用其external programs plugins,在Dovecot中配置要允许用户使用的外部程序,然后用户可以使用“ vnd.dovecot.execute”扩展名运行那些程序。您可能可以使用它来移植与procmail一起使用的所有脚本。

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

答案 1 :(得分:0)

这是我的筛子脚本,可将Received转换为Date

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进行了这项工作