如何在Postfix中指定目标目录与MySQL?

我已经build立了Postfix,Dovecot和MySQL的邮件服务器。 德沃科特完美的作品。 Postfix发送邮件,但是我收到邮件有问题。

经过2天的debugging和调整configuration,我现在可以成功地收到邮件。 唯一的问题是Postfix将邮件保存在错误的地方。 我希望将邮件保存在/var/mail/vhosts/domain.tld/user/ 目录中,作为[email protected]但邮件保存在/var/mail/vhosts/[email protected] 文件中

 / var / mail / vhosts / user @ domain . tld ------------------------------- ----------------------------- ^ virtual_mailbox_base ^ ^ sql result from ^ | virtual_mailbox_maps | 

后缀configuration

 # (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扩展function。 见man 5 mysql_table 。

这里是你的查询的替代版本

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

当input为[email protected] ,string%d/%u/将展开为example.com/user/ 。 这部分WHERE email='%s'将限制此查询只有有效的用户名。

看这个博客post来获得这个扩展的例子。


文档页面的相关摘录

查询用于search数据库的SQL查询模板,其中%s是Postfix尝试parsing的地址的替代,例如query = SELECTreplaceFROM别名WHERE mailbox ='%s'

该参数支持以下“%”扩展:

%%这被字面上的'%'字符所取代。

%s这被input键replace。 SQL引用用于确保input密钥不会添加意外的元字符。

%u当input键是user @ domainforms的地址时,%u被SQL引用的地址部分replace。 否则,%u被整个searchstringreplace。 如果localpart为空,则查询被抑制并返回任何结果。

%d当input键是user @ domainforms的地址时,%d被地址的SQL引用的域部分replace。 否则,查询被抑制并返回任何结果。

我做了一个小技巧来解决这个问题。 我改变了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' 

我仍然想知道是否有比这个便宜的解决方法更好的方法。