LINUX.ORG.RU
ФорумAdmin

Postfix не всегда работает forwarding

 ,


0

1

Postfix настроен в связке с Dovecot/MariaDB. Входящее на мой сервер письмо форвардится с сервера Front.com с адресом а-ля цифро_буквы@in.front.com и я получаю его в inbox юзера. Но когда в почтовом клиенте юзер отвечает на письмо - оно не отсылается обратно на исходный цифро_буквы@in.front.com а тупо ложатся в локальный инбокс юзера, а не в инбокс отправителя на Front.com.

В заголовках входящего письма присутствуют такие строки:

X-Front-ID: 6f28949f9068ee526037c105a09421b0@frontapp.com
References: <6f28949f9068ee526037c105a09421b0@frontapp.com>
Message-ID: <6f28949f9068ee526037c105a09421b0@frontapp.com>

и в качестве From: указан email юзера, а не цифро_буквы@in.front.com.

При этом alias в таблице aliases задан для адреса юзера и связан с цифро_буквы@in.front.com.

На сервисе Front.com он позиционируется как forwarding email.

Возможно ли использовать костыль какой-нибудь, к примеру .procmailrc c правилом, если от такого-то юзера или Subject: такой-то то форвардить явно на цифро_буквы@in.front.com?

Если да, то куда ж его поместить если почта юзера лежит в /var/vmail/mailboxes/domain.com/user/mail и все файлы/каталоги в нем принадлежат vmail, но

# cat /etc/passwd | grep vmail
vmail:x:1000:1000::/var/vmail:/usr/sbin/nologin

?

В /var/vmail/.procmailrc?

Так как если я при ответе явно указываю адрес получателя цифро_буквы@in.front.com в почтовом клиенте юзера, письмо нормально доходит до инбокса на Front.com.



Последнее исправление: zorinquen (всего исправлений: 2)

Лучше делайте через Sieve. Плагин должен быть включен в конфигурации Dovecot.

sudo apt install dovecot-sieve

В файле /var/vmail/mailboxes/domain.com/user/.dovecot.sieve:

require ["fileinto", "envelope", "regex"];

if anyof (
    header :regex "References" "<[a-f0-9]+@frontapp\.com>",
    header :regex "Message-ID" "<[a-f0-9]+@frontapp\.com>"
) {
    redirect "цифро_буквы@in.front.com";
    stop;
}
sudo chown -R vmail:vmail /var/vmail/mailboxes
sudo sievec /var/vmail/mailboxes/domain.com/user/.dovecot.sieve
basename
()
Ответ на: комментарий от basename

К сожалению так не сработало, все равно в инбокс юзера попадает. А regex

    header :regex "References" "<[a-f0-9]+@frontapp\.com>",
    header :regex "Message-ID" "<[a-f0-9]+@frontapp\.com>"

точно совпадает с

7c346ab9075657561e97f6e064b5f2fc@frontapp.com

Может надо использовать только

header :regex "X-Front-ID" "<[a-f0-9]+@frontapp\.com>"

? Так как в заголовке письма в инбоксе юзера X-Front-ID указан без <….>, a References и Message-ID с <…>:

X-Front-ID: 7c346ab9075657561e97f6e064b5f2fc@frontapp.com
References: <7c346ab9075657561e97f6e064b5f2fc@frontapp.com>
Message-ID: <7c346ab9075657561e97f6e064b5f2fc@frontapp.com>

А не может проблема быть в правах доступа? После запуска под root

# sievec /var/vmail/mailboxes/domain.com/user/.dovecot.sieve

на сервере

-rw-r--r--  1 vmail vmail  249 Feb 22 09:38 .dovecot.sieve
-rw-r--r--  1 root  root   432 Feb 22 09:41 .dovecot.svbin

zorinquen
() автор топика
Ответ на: комментарий от zorinquen

А так?

require ["regex", "variables", "fileinto", "envelope", "redirect"];

if anyof (
    header :regex "X-Front-ID" "^[a-f0-9]+@frontapp\.com$",
    header :regex "References" "<[a-f0-9]+@frontapp\.com>",
    header :regex "Message-ID" "<[a-f0-9]+@frontapp\.com>"
) {
    redirect "цифро_буквы@in.front.com";
    stop;
}
sudo chown vmail:vmail /var/vmail/mailboxes/domain.com/user/.dovecot.svbin
sudo chmod 644 /var/vmail/mailboxes/domain.com/user/.dovecot.svbin

Проверка:

ls -la /var/vmail/mailboxes/domain.com/user/.dovecot.s*

Должно быть:

-rw-r--r-- 1 vmail vmail  ... .dovecot.sieve
-rw-r--r-- 1 vmail vmail  ... .dovecot.svbin
basename
()
Ответ на: комментарий от basename
# sievec /var/vmail/mailboxes/domain.com/user/.dovecot.sieve
.dovecot: line 1: error: require command: `redirect' is not known as a Sieve capability, but it is known as a Sieve command that is always available.
.dovecot: error: validation failed.
sievec(root): Fatal: failed to compile sieve script '/var/vmail/mailboxes/domain.com/user/.dovecot.sieve'
zorinquen
() автор топика
Ответ на: комментарий от basename

а не может быть какой-то несовместимости с моей текущей конфигурацией sieve, описанной в dovecot.conf:

plugin {
    sieve_plugins = sieve_imapsieve sieve_extprograms
    sieve_before = /var/vmail/sieve/global/spam-global.sieve
    sieve = file:/var/vmail/sieve/%d/%n/scripts;active=/var/vmail/sieve/%d/%n/active-script.sieve

    ###
    ### Spam learning
    ###
    # From elsewhere to Spam folder
    imapsieve_mailbox1_name = Spam
    imapsieve_mailbox1_causes = COPY
    imapsieve_mailbox1_before = file:/var/vmail/sieve/global/learn-spam.sieve
    
    # From Spam folder to elsewhere
    imapsieve_mailbox2_name = *
    imapsieve_mailbox2_from = Spam
    imapsieve_mailbox2_causes = COPY
    imapsieve_mailbox2_before = file:/var/vmail/sieve/global/learn-ham.sieve

    sieve_pipe_bin_dir = /usr/bin
    sieve_global_extensions = +vnd.dovecot.pipe

    quota = maildir:User quota
    quota_exceeded_message = User %u has exhausted allowed storage space.
}

?

zorinquen
() автор топика
Ответ на: комментарий от zorinquen

нет, стоп

plugin {
    
    sieve = file:/var/vmail/mailboxes/%d/%n;active=~/.dovecot.sieve
    sieve_before = /var/vmail/sieve/global/spam-global.sieve
    sieve_plugins = sieve_imapsieve sieve_extprograms
    
    
    sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.redirect
    
    
    imapsieve_mailbox1_name = Spam
    imapsieve_mailbox1_causes = COPY
    imapsieve_mailbox1_before = file:/var/vmail/sieve/global/learn-spam.sieve
    
    
    imapsieve_mailbox2_name = *
    imapsieve_mailbox2_from = Spam
    imapsieve_mailbox2_causes = COPY
    imapsieve_mailbox2_before = file:/var/vmail/sieve/global/learn-ham.sieve

    
    sieve_pipe_bin_dir = /usr/bin
    
    
    quota = maildir:User quota
    quota_exceeded_message = User %u has exceeded allocated storage space.
}

require ["regex", "redirect"];

if anyof (
    header :regex "X-Front-ID" "^[a-f0-9]+@frontapp\.com$",
    header :regex "References" "<[a-f0-9]+@frontapp\.com>",
    header :regex "Message-ID" "<[a-f0-9]+@frontapp\.com>"
) {
    redirect "цифро_буквы@in.front.com";
    stop;
}

Здесь что?

/etc/dovecot/conf.d/90-sieve.conf

plugin {
    sieve_extensions = +vnd.dovecot.redirect
    sieve = file:~/sieve;active=~/.dovecot.sieve
}

sudo systemctl restart dovecot - делали?

Скрипт лежит здесь? /var/vmail/mailboxes/domain.com/user/.dovecot.sieve

basename
()
Последнее исправление: basename (всего исправлений: 2)
Ответ на: комментарий от basename

изменил так:

plugin {
    sieve = file:/var/vmail/mailboxes/%d/%n;active=~/.dovecot.sieve
    sieve_plugins = sieve_imapsieve sieve_extprograms
    sieve_before = /var/vmail/sieve/global/spam-global.sieve
#    sieve = file:/var/vmail/sieve/%d/%n/scripts;active=/var/vmail/sieve/%d/%n/active-script.sieve

    ###
    ### Spam learning
    ###
    # From elsewhere to Spam folder
    imapsieve_mailbox1_name = Spam
    imapsieve_mailbox1_causes = COPY
    imapsieve_mailbox1_before = file:/var/vmail/sieve/global/learn-spam.sieve

    # From Spam folder to elsewhere
    imapsieve_mailbox2_name = *
    imapsieve_mailbox2_from = Spam
    imapsieve_mailbox2_causes = COPY
    imapsieve_mailbox2_before = file:/var/vmail/sieve/global/learn-ham.sieve

    sieve_pipe_bin_dir = /usr/bin
    #sieve_global_extensions = +vnd.dovecot.pipe
    sieve_global_extensions = +vnd.dovecot.pipe  +vnd.dovecot.redirect

    quota = maildir:User quota
    quota_exceeded_message = User %u has exhausted allowed storage space.

    require ["fileinto", "envelope", "regex", "variables"];

    if anyof (
        header :regex "X-Front-ID" "^[a-f0-9]+@frontapp\.com$",
        header :regex "References" "<[a-f0-9]+@frontapp\.com>",
        header :regex "Message-ID" "<[a-f0-9]+@frontapp\.com>"
    ) {
        redirect "j39lj-f37d67c8458541339867@in.frontapp.com";
        stop;
    }

}

В /etc/dovecot/conf.d/90-sieve.conf было только:

plugin {
  sieve = file:~/sieve;active=~/.dovecot.sieve
}

добавил

plugin {
    sieve_extensions = +vnd.dovecot.redirect
    sieve = file:~/sieve;active=~/.dovecot.sieve
}

но при этом Dovecot не стартует.

zorinquen
() автор топика
Ответ на: комментарий от basename

скрипт лежал сначала здесь:

/var/vmail/mailboxes/domain.com/user/.dovecot.sieve

потом пробовал его скопировать и сюда:

/var/vmail/mailboxes/domain.com/user/mail/.dovecot.sieve

т.к. инбокс тут:

root@mail:/var/vmail/mailboxes/domain.com/user/mail# ls -la
total 348
drwx------ 10 vmail vmail   4096 Feb 22 12:02 .
drwx------  3 vmail vmail   4096 Feb 22 11:34 ..
-rw-r--r--  1 vmail vmail    322 Feb 22 11:32 .dovecot.sieve
-rw-r--r--  1 vmail vmail    519 Feb 22 12:02 .dovecot.svbin
drwx------  5 vmail vmail   4096 Feb 19 19:30 Archive
drwx------  5 vmail vmail   4096 Feb 19 19:30 Drafts
drwx------  5 vmail vmail   4096 Feb 19 19:30 Sent
drwx------  5 vmail vmail   4096 Feb 19 19:23 Spam
drwx------  5 vmail vmail   4096 Feb 19 19:30 Trash
drwx------  2 vmail vmail  12288 Feb 19 21:01 cur
-rw-------  1 vmail vmail   9095 Feb 22 11:43 dovecot-uidlist
-rw-------  1 vmail vmail      8 Feb 19 19:23 dovecot-uidvalidity
-r--r--r--  1 vmail vmail      0 Feb 11 12:47 dovecot-uidvalidity.67ab46da
-rw-------  1 vmail vmail   4040 Feb 20 10:02 dovecot.index
-rw-------  1 vmail vmail 239656 Feb 22 11:43 dovecot.index.cache
-rw-------  1 vmail vmail   3728 Feb 22 11:43 dovecot.index.log
-rw-------  1 vmail vmail   4224 Feb 19 19:30 dovecot.list.index.log
-rw-------  1 vmail vmail    120 Feb 19 19:23 dovecot.mailbox.log
-rw-------  1 vmail vmail     15 Feb 19 19:23 maildirsize
drwx------  2 vmail vmail  12288 Feb 22 11:43 new
-rw-------  1 vmail vmail     36 Feb 19 19:23 subscriptions
drwx------  2 vmail vmail   4096 Feb 22 11:43 tmp

zorinquen
() автор топика

/etc/dovecot/dovecot.conf

!include conf.d/*.conf
mail_plugins = $mail_plugins sieve

/etc/dovecot/conf.d/90-sieve.conf

plugin {
    sieve = file:/var/vmail/mailboxes/%d/%n;active=~/.dovecot.sieve
    sieve_plugins = sieve_imapsieve sieve_extprograms
    sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.redirect +vnd.dovecot.editheader +vnd.dovecot.regex
    sieve_before = /var/vmail/sieve/global/spam-global.sieve

    imapsieve_mailbox1_name = Spam
    imapsieve_mailbox1_causes = COPY
    imapsieve_mailbox1_before = file:/var/vmail/sieve/global/learn-spam.sieve

    imapsieve_mailbox2_name = *
    imapsieve_mailbox2_from = Spam
    imapsieve_mailbox2_causes = COPY
    imapsieve_mailbox2_before = file:/var/vmail/sieve/global/learn-ham.sieve

    sieve_pipe_bin_dir = /usr/bin
    quota = maildir:User quota
    quota_exceeded_message = User %u has exhausted allowed storage space.
}

/var/vmail/mailboxes/domain.com/user/.dovecot.sieve

require ["regex", "redirect", "editheader", "envelope", "variables"];

if not header :contains "X-Loop" "redirected" {
    if anyof (
        header :regex "X-Front-ID" "^[a-f0-9]+@frontapp\.com$",
        header :regex "References" "<([a-f0-9]+)@frontapp\.com>",
        header :regex "Message-ID" "<([a-f0-9]+)@frontapp\.com>"
    ) {
        addheader "X-Loop" "redirected";
        redirect "forwarding-12345@in.frontapp.com";
        stop;
    }
}

if anyof (
    header :regex "References" "<([a-f0-9]+)@frontapp\.com>",
    header :regex "In-Reply-To" "<([a-f0-9]+)@frontapp\.com>"
) {
    deleteheader "From";
    addheader "From" "forwarding-12345@in.frontapp.com";
}

/etc/postfix/main.cf добавить:

# Подмена From для ответов на письма Front.com
smtp_header_checks = pcre:/etc/postfix/header_checks.pcre

/etc/postfix/header_checks.pcre

/^\s*(References|In-Reply-To):.*<([a-f0-9]+)@frontapp\.com>/ PREPEND From: forwarding-12345@in.frontapp.com

Создание глобальных скриптов (если только их нет), просто пустые файлы

sudo mkdir -p /var/vmail/sieve/global
sudo touch /var/vmail/sieve/global/{spam-global.sieve,learn-spam.sieve,learn-ham.sieve}
sudo chown -R vmail:vmail /var/vmail/sieve
sudo chown vmail:vmail /var/vmail/mailboxes/domain.com/user/.dovecot.sieve
sudo chmod 644 /var/vmail/mailboxes/domain.com/user/.dovecot.sieve
sudo -u vmail sievec /var/vmail/mailboxes/domain.com/user/.dovecot.sieve
sudo postmap /etc/postfix/header_checks.pcre
sudo systemctl restart postfix dovecot

Нужно заменить forwarding-12345@in.frontapp.com на реальный адрес.

basename
()
Последнее исправление: basename (всего исправлений: 3)
Ответ на: комментарий от basename
# ##
## Activated protocols
##

protocols = imap lmtp sieve pop3


##
## TLS Config
## Quelle: https://ssl-config.mozilla.org/#server=dovecot&version=2.3.9&config=intermediate&openssl=1.1.1d&guideline=5.4
##

ssl = required
ssl_cert = </etc/acme.sh/mail.domain.com/fullchain.pem
ssl_key = </etc/acme.sh/mail.domain.com/privkey.pem
ssl_dh = </etc/dovecot/dh4096.pem
ssl_min_protocol = TLSv1.2
ssl_cipher_list = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl_prefer_server_ciphers = no


##
## Dovecot services
##

service imap-login {
    inet_listener imap {
        port = 143
    }
}

service managesieve-login {
    inet_listener sieve {
        port = 4190
    }
}

service lmtp {
    unix_listener /var/spool/postfix/private/dovecot-lmtp {
        mode = 0660
        group = postfix
        user = postfix
    }

    user = vmail
}


service pop3-login {
    inet_listener pop3 {
        port = 110
    }
    inet_listener pop3s {
        port = 995
        ssl = yes
    }
}


service auth {
    ### Auth socket for Postfix
    unix_listener /var/spool/postfix/private/auth {
        mode = 0660
        user = postfix
        group = postfix
    }

    ### Auth socket for LMTP-Service
    unix_listener auth-userdb {
        mode = 0660
        user = vmail
        group = vmail
    }
}


##
##  Protocol settings
##

protocol imap {
    mail_plugins = $mail_plugins quota imap_quota imap_sieve
    mail_max_userip_connections = 20
    imap_idle_notify_interval = 29 mins
}

protocol lmtp {
    postmaster_address = postmaster@apacseo.com
    mail_plugins = $mail_plugins sieve notify push_notification
}

protocol pop3 {
    mail_plugins = $mail_plugins quota
    mail_max_userip_connections = 20
    pop3_uidl_format = %08Xu%08Xv
}


##
## Client authentication
##

disable_plaintext_auth = yes
auth_mechanisms = plain login
auth_username_format = %Lu

passdb {
    driver = sql
    args = /etc/dovecot/dovecot-sql.conf
}

userdb {
    driver = sql
    args = /etc/dovecot/dovecot-sql.conf
}


##
## Address tagging
##
recipient_delimiter = +


##
## Mail location
##

mail_uid = vmail
mail_gid = vmail
mail_privileged_group = vmail

mail_home = /var/vmail/mailboxes/%d/%n
mail_location = maildir:~/mail:LAYOUT=fs


##
## Mailbox configuration
##

namespace inbox {
    inbox = yes

    mailbox Spam {
        auto = subscribe
        special_use = \Junk
    }

    mailbox Trash {
        auto = subscribe
        special_use = \Trash
    }

    mailbox Drafts {
        auto = subscribe
        special_use = \Drafts
    }

    mailbox Sent {
        auto = subscribe
        special_use = \Sent
    }
}


##
## Mail plugins
##

plugin {
    sieve_plugins = sieve_imapsieve sieve_extprograms
    sieve_before = /var/vmail/sieve/global/spam-global.sieve
    sieve = file:/var/vmail/sieve/%d/%n/scripts;active=/var/vmail/sieve/%d/%n/active-script.sieve

    ###
    ### Spam learning
    ###
    # From elsewhere to Spam folder
    imapsieve_mailbox1_name = Spam
    imapsieve_mailbox1_causes = COPY
    imapsieve_mailbox1_before = file:/var/vmail/sieve/global/learn-spam.sieve

    # From Spam folder to elsewhere
    imapsieve_mailbox2_name = *
    imapsieve_mailbox2_from = Spam
    imapsieve_mailbox2_causes = COPY
    imapsieve_mailbox2_before = file:/var/vmail/sieve/global/learn-ham.sieve

    sieve_pipe_bin_dir = /usr/bin
    sieve_global_extensions = +vnd.dovecot.pipe

    quota = maildir:User quota
    quota_exceeded_message = User %u has exhausted allowed storage space.
}

# cat /etc/dovecot/conf.d/90-sieve.conf
plugin {

  sieve_extensions = +vnd.dovecot.redirect
  sieve = file:~/sieve;active=~/.dovecot.sieve
}  

# cat /var/vmail/mailboxes/domain.com/user/.dovecot.sieve
require ["fileinto", "envelope", "regex", "variables"];

if anyof (
    header :regex "X-Front-ID" "^[a-f0-9]+@frontapp\.com$",
    header :regex "References" "<[a-f0-9]+@frontapp\.com>",
    header :regex "Message-ID" "<[a-f0-9]+@frontapp\.com>"
) {
    redirect "j39lj-f37d67c8458541339867@in.frontapp.com";
    stop;
}

zorinquen
() автор топика