簡體   English   中英

使用 Sieve 將日期 header 添加到傳入的 email

[英]Add date header to incoming email with Sieve

我正在尋找一種方法來在 Sieve 中做一些我多年來一直在 Procmail 中做的事情,即在收到的郵件中插入一個明確的日期 header,這對我來說很清楚——獨立於隱藏的“已接收”標題可能有多個服務器,但是我的郵件客戶端會解釋郵件發送的日期——我的服務器收到郵件的時間。 這就是我在 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 ),它顯然會添加一個 header,但由於我讀到的其他內容(抱歉,不記得在哪里)我相信 Sieve 不會在 shell 中運行“date”命令由於限制或出於安全原因不運行 shell 命令的預期(並且可以理解)偏好。

其他可能有用的信息:我正在通過 Roundcube 1.3.6 執行此操作,但我有一種感覺( 也是由於我閱讀的內容)如果我在 Roundcube 中編輯原始代碼,Roundcube 可能會覆蓋自定義 Sieve 過濾器集。 如有必要,我很樂意直接在服務器上編輯或創建一個 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 錯誤編輯 Sieve 過濾器集。

搜索此錯誤會返回一個相關結果,但未發布任何解決方案。

不過,我不打算專注於 Roundcube。 正如我之前所說,如有必要,我將從命令行添加此 Sieve 過濾器。

Pigeonhole篩孔Editheader擴展默認情況下不可用。 根據其文檔 ,您需要確保已將其添加到服務器上的篩分擴展列表中:

plugin {
  # Use editheader
  sieve_extensions = +editheader
}

如果要像在procmail中一樣在Dovecot上使用篩子來運行任意腳本,則可以使用其外部程序插件 ,在Dovecot中配置要允許用戶使用的外部程序,然后用戶可以使用“ vnd”。 dovecot.execute”擴展名來運行這些程序。 您也許可以使用它來移植與procmail一起使用的所有腳本。

在一般情況下,篩查的目的是使用戶能夠配置自己的郵件過濾,而您似乎實際上正在嘗試為服務器進行全局處理。 Dovecot在處理郵件時應添加自己的Received標頭,這是標記郵件系統何時收到郵件的標准方法,因此我不清楚您為什么不僅僅使用它,或者您想進行哪些更改為其默認行為。 可能您希望做的事情在郵件傳輸代理中要比在郵件傳遞代理中得到更好的處理。

這是我的篩子腳本,將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完成了這項工作

您可以使用date插件。 請參閱: rfc5260

require "date";
require "editheader";

if currentdate :matches "std11" "*" {
    addheader :last "X-Local-Date-Received" "${1}";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM