设置Postfix + Dovecot从数据库读取

我试图设置PostfixDovecot ,后者的虚拟用户存储在一个MySQL数据库中,按照这个指南 (但是在这里我重申一切,因为我在下面的注释中修复了一些“错误”)。 序言:我已经从Ubuntu存储库安装了PostfixDovecotpostfix-mysqldovecot-mysql

让我们从Postfixconfiguration开始:

 smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) biff = no readme_directory = no myhostname = localhost alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydestination = localhost relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all relay_domains = * virtual_alias_maps = proxy:mysql:/etc/postfix/virtual_alias_maps.cf virtual_mailbox_domains = proxy:mysql:/etc/postfix/virtual_mailbox_domains.cf virtual_mailbox_maps = proxy:mysql:/etc/postfix/virtual_mailbox_maps.cf virtual_mailbox_base = /home/vmail virtual_mailbox_limit = 512000000 virtual_minimum_uid = 5000 virtual_transport = virtual virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 local_transport = virtual local_recipient_maps = $virtual_mailbox_maps transport_maps = hash:/etc/postfix/transport smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path = /var/run/dovecot/auth-client smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_sasl_security_options = noanonymous smtpd_sasl_tls_security_options = $smtpd_sasl_security_options smtpd_tls_auth_only = yes smtpd_tls_cert_file = /etc/ssl/private/server.crt smtpd_tls_key_file = /etc/ssl/private/server.key smtpd_sasl_local_domain = $myhostname broken_sasl_auth_clients = yes smtpd_tls_loglevel = 1 

然后,我创build了用户vmail来存储电子邮件

 groupadd -g 5000 vmail useradd -u 5000 -g vmail -s /usr/bin/nologin -d /home/vmail -m vmail 

和MySQL数据库和用户存储有关域和虚拟用户的信息:

 CREATE DATABASE postfix_db; USE postfix_db; CREATE USER postfix_user@localhost IDENTIFIED BY 'password'; GRANT ALL ON postfix_db.* TO postfix_user@localhost; FLUSH PRIVILEGES; 

然后我创build了与域,转发和用户有关的表格:

 CREATE TABLE `domains` ( `domain` varchar(50) NOT NULL default "", PRIMARY KEY (`domain`), UNIQUE KEY `domain` (`domain`) ); CREATE TABLE `forwardings` ( `source` varchar(80) NOT NULL default "", `destination` text NOT NULL, PRIMARY KEY (`source`) ); CREATE TABLE `users` ( `email` varchar(80) NOT NULL default "", `password` varchar(20) NOT NULL default "", `quota` varchar(20) NOT NULL default '20971520', `domain` varchar(255) NOT NULL default "", UNIQUE KEY `email` (`email`) ); 

我在表格中添加了我的域(A和MXlogging已正确设置):

 INSERT INTO `domains` VALUES ('virtualdomain.tld'); 

以及与该域相关的帐户:

 INSERT INTO `users` VALUES ('[email protected]', ENCRYPT('password'), '20971520', 'virtualdomain.tld'); 

然后我创build了一个自签名的证书:

 cd /etc/ssl/private/ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out server.key chmod 400 server.key openssl req -new -key server.key -out server.csr openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt chmod 444 server.crt 

然后我在Postfixconfiguration文件中提到的文件:

/etc/postfix/virtual_alias_maps.cf

 user = postfix_user password = hunter2 hosts = localhost dbname = postfix_db table = domains select_field = domain where_field = domain 

/etc/postfix/virtual_mailbox_domains.cf

 user = postfix_user password = hunter2 hosts = localhost dbname = postfix_db table = forwardings select_field = destination where_field = source 

/etc/postfix/virtual_mailbox_maps.cf

 user = postfix_user password = hunter2 hosts = localhost dbname = postfix_db table = users select_field = concat(domain,'/',email,'/') where_field = email 

接着

 touch /etc/postfix/transport postmap /etc/postfix/transport 

现在我删除了默认的Dovecotconfiguration文件,将其replace为:

 protocols = imap auth_mechanisms = plain passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf } userdb { driver = sql args = /etc/dovecot/dovecot-sql.conf } service auth { unix_listener auth-client { group = postfix mode = 0660 user = postfix } user = root } mail_home = /home/vmail/%d/%u mail_location = maildir:~ ssl_cert = </etc/ssl/private/server.crt ssl_key = </etc/ssl/private/server.key 

我创build了/etc/dovecot/dovecot-sql.conf文件:

 driver = mysql connect = host=localhost dbname=postfix_db user=postfix_user password=hunter2 # The new name for MD5 is MD5-CRYPT so you might need to change this depending on version default_pass_scheme = MD5-CRYPT # Get the mailbox user_query = SELECT '/home/vmail/%d/%u' as home, 'maildir:/home/vmail/%d/%u' as mail, 5000 AS uid, 5000 AS gid, concat('dirsize:storage=', quota) AS quota FROM users WHERE email = '%u' # Get the password password_query = SELECT email as user, password, '/home/vmail/%d/%u' as userdb_home, 'maildir:/home/vmail/%d/%u' as userdb_mail, 5000 as userdb_uid, 5000 as userdb_gid FROM users WHERE email = '%u' # If using client certificates for authentication, comment the above and uncomment the following #password_query = SELECT null AS password, '%u' AS user 

…最后重新启动了dovecot和postfix:

 service postfix dovecot restart 

问题是,当我尝试发送电子邮件到[email protected] ,我在日志中看到这个:

 NOQUEUE: reject: RCPT from blablabla.com[xxx.xxx.xxx.xxx]: 451 4.3.0 <[email protected]>: Temporary lookup failure; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<blablabla.com> 

邮件反弹回来的错误

 550 5.1.1 "Recipient address rejected: User unknown in virtual alias table" 

看起来,你的virtual_alias_mapsvirtual_mailbox_domains被交换了。 尝试重命名它们

 mv /etc/postfix/virtual_alias_maps.cf /tmp/virtual_mailbox_domains.tmp mv /etc/postfix/virtual_mailbox_domains.cf /etc/postfix/virtual_alias_maps.cf mv /tmp/virtual_mailbox_domains.tmp /etc/postfix/virtual_mailbox_domains.cf 

不要忘记运行postfix reload

我确信Dovecot是创buildauth文件的一个,因为postfix与dovecot进行交谈,dovecot在“dovecot.conf”中进行身份validation,所以添加:

 path = /var/run/dovecot/auth-client 

进入客户端块如下所示:

 service auth { unix_listener auth-client { path = /var/run/dovecot/auth-client group = postfix mode = 0660 user = postfix } 

要么

 service auth { unix_listener /var/run/dovecot/auth-client { group = postfix mode = 0660 user = postfix } 

重新启动dovecot

检查/ var / run / dovecot / auth-client是否被创build

inputls -l /var/run/dovecot/auth-client进行确认。

然后重试。