Estou tentando configurar o Postfix e o Dovecot , este último com usuários virtuais armazenados em um banco de dados MySQL, seguindo este guia (mas aqui recapitulo tudo pois existem alguns "bugs" no guia que corrigi seguindo os comentários). Preâmbulo: Eu tenho Postfix
, Dovecot
, postfix-mysql
e dovecot-mysql
instalei a partir dos repositórios do Ubuntu.
Vamos começar com a configuração do Postfix:
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
Então criei um usuário vmail
para armazenar e-mails:
groupadd -g 5000 vmail
useradd -u 5000 -g vmail -s /usr/bin/nologin -d /home/vmail -m vmail
E banco de dados MySQL e usuário para armazenar informações sobre domínios e usuários virtuais:
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;
Então criei as tabelas relacionadas a domínios, encaminhamentos e usuários:
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`)
);
Adicionei meu domínio (que possui os registros A e MX devidamente configurados) na tabela:
INSERT INTO `domains` VALUES ('virtualdomain.tld');
E uma conta relacionada a esse domínio:
INSERT INTO `users` VALUES ('[email protected]', ENCRYPT('password'), '20971520', 'virtualdomain.tld');
Em seguida, criei um certificado autoassinado:
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
E então os arquivos aos quais eu estava me referindo na configuração do Postfix:
/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
E depois
touch /etc/postfix/transport
postmap /etc/postfix/transport
Agora apaguei o arquivo de configuração padrão do Dovecot, substituindo-o por:
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
Eu criei o /etc/dovecot/dovecot-sql.conf
arquivo:
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
... e finalmente reiniciei dovecot e postfix:
service postfix dovecot restart
O problema é que quando tento enviar um e-mail para [email protected]
, vejo isso nos logs:
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>
E o e-mail retorna com o erro
550 5.1.1 "Recipient address rejected: User unknown in virtual alias table"
Parece que o seu
virtual_alias_maps
evirtual_mailbox_domains
foi trocado. Tente renomeá-losNão se esqueça de correr
postfix reload
.Tenho certeza que Dovecot é quem cria o arquivo de autenticação, já que o postfix fala com o dovecot e o dovecot faz a autenticação, então no seu 'dovecot.conf' adicione:
no bloco do cliente assim:
ou
Reiniciar pombal
Verifique se /var/run/dovecot/auth-client foi criado
digite
ls -l /var/run/dovecot/auth-client
para confirmar.Em seguida, tente novamente.