Назад | Перейти на главную страницу

Как указать целевой каталог в Postfix с MySQL?

Я установил почтовый сервер с Postfix, Dovecot и MySQL. Dovecot работает отлично. Postfix отправляет почту, но у меня проблема с получением почты.

После 2 дней отладки и настройки конфигураций я теперь могу успешно получать почту. Единственная проблема в том, что Postfix сохраняет почту не в том месте. Я хочу, чтобы письма сохранялись в /var/mail/vhosts/domain.tld/user/ каталог для user@domain.tld но письма сохраняются в /var/mail/vhosts/user@domain.tld файл.

/ v a r / m a i l / v h o s t s / u s e r @ d o m a i n . t l d
-------------------------------   -----------------------------
^    virtual_mailbox_base     ^   ^     sql result from       ^
                                  |   virtual_mailbox_maps    |

-

Конфигурация Postfix

# (postconf -d; postconf -d; postconf -n;) | sort | uniq -u
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
broken_sasl_auth_clients = yes
local_recipient_maps = $virtual_mailbox_maps
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
mydestination = localhost.localdomain, localhost
myhostname = {censored}
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
myorigin = /etc/mailname
process_id = 6297
process_id = 6298
readme_directory = no
recipient_delimiter = +
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_tls_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem
smtpd_tls_cert_file = /etc/ssl/certs/mail.roofworkshop.com.crt
smtpd_tls_key_file = /etc/ssl/private/mail.roofworkshop.com.key
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_note_starttls_offer = yes
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
virtual_gid_maps = static:5000
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_uid_maps = static:5000

mysql-virtual-mailbox-domains.cf

user = mailuser
password = {censored}
hosts = 127.0.0.1
dbname = mailserver
query = SELECT name FROM virtual_domains WHERE name='%s'

mysql-virtual-mailbox-maps.cf

user = mailuser
password = {censored}
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s'

Другой метод - использование функции расширения mysql в postfix. Видеть человек 5 mysql_table.

Вот альтернативная версия вашего запроса

query = SELECT '%d/%u/' FROM virtual_users WHERE email='%s';

Когда ввод был user@example.com, строка %d/%u/ расширится до example.com/user/. Эта часть WHERE email='%s' ограничит этот запрос только действительным именем пользователя.

Смотрите также это сообщение в блоге чтобы получить пример этого расширения.


Соответствующий отрывок со страницы документации

запрос Шаблон запроса SQL, используемый для поиска в базе данных, где% s является заменой адреса, который Postfix пытается разрешить, например query = ВЫБРАТЬ замену FROM aliases WHERE mailbox = '% s'

Этот параметр поддерживает следующие расширения "%":

%% Он заменяется буквальным символом «%».

% s Он заменяется клавишей ввода. Цитирование SQL используется, чтобы гарантировать, что ключ ввода не добавляет неожиданные метасимволы.

% u Если ключ ввода является адресом в форме user @ domain,% u заменяется локальной частью адреса в кавычках SQL. В противном случае% u заменяется всей строкой поиска. Если localpart пуста, запрос подавляется и не возвращает результатов.

% d Когда входной ключ является адресом в форме user @ domain,% d заменяется частью адреса, заключенной в кавычки SQL. В противном случае запрос подавляется и не возвращает результатов.

Я сделал небольшой трюк, чтобы решить проблему. Я изменился mysql-virtual-mailbox-maps.cf файл следующим образом:

user = mailuser
password = {censored}
hosts = 127.0.0.1
dbname = mailserver
query = SELECT CONCAT(SUBSTRING(email, LOCATE('@', email) + 1), '/', SUBSTRING_INDEX(email, '@', 1), '/') AS `domain` FROM virtual_users WHERE email='%s'

Я все еще хотел бы знать, есть ли лучшие методы, чем этот дешевый обходной путь.