Добавить заголовок даты на входящее письмо с помощью Sieve

Я ищу способ сделать в 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 не будет запускать команду "date" в оболочке либо из-за ограничений, либо из-за предполагаемого (и понятного) предпочтения не запускать команды оболочки по соображениям безопасности.

Другая, возможно, полезная информация: я делаю это через Roundcube 1.3.6, но у меня есть ощущение ( также из-за того, что я прочитал), что Roundcube может перезаписать пользовательский набор фильтров Sieve, если я отредактирую необработанный код в 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 из командной строки, если это необходимо.

3 ответа

Расширение Pigeonhole Sieve Editheader по умолчанию недоступно. В соответствии с его документацией, вы должны убедиться, что он добавлен в ваш список расширений sieve на сервере:

plugin {
  # Use editheader
  sieve_extensions = +editheader
}

Если вы хотите запускать произвольные сценарии с использованием sieve в Dovecot, как вы можете это делать с procmail, то вы можете использовать плагины его внешних программ, настроить в Dovecot, какие внешние программы вы хотите разрешить пользователям, а затем пользователи могут использовать "vnd. dovecot.execute "расширение для запуска этих программ. Возможно, вы сможете использовать это для переноса любых сценариев, которые вы использовали с procmail.

В общем случае цель sieve состоит в том, чтобы пользователи могли настраивать свою собственную фильтрацию почты, в то время как кажется, что вы пытаетесь сделать что-то глобально для сервера. 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}";
}
Другие вопросы по тегам