Email Server · 8 min read · Jan 26, 2026
Usuários e Domínios Virtuais Com Postfix, Courier, MySQL e SquirrelMail (Ubuntu 14.04LTS)
Este tutorial é Copyright (c) 2014 por Falko Timme & Srijan Kishore. É derivado de um tutorial de Christoph Haas que você pode encontrar em http://workaround.org. Você é livre para usar este tutorial sob a licença Creative Commons 2.5 ou qualquer versão posterior.
Este documento descreve como instalar um servidor de email Postfix que é baseado em usuários e domínios virtuais, ou seja, usuários e domínios que estão em um banco de dados MySQL. Também demonstrarei a instalação e configuração do Courier (Courier-POP3, Courier-IMAP), para que o Courier possa autenticar contra o mesmo banco de dados MySQL que o Postfix usa.
O servidor Postfix resultante é capaz de SMTP-AUTH e TLS e quota (quota não está embutida no Postfix por padrão, eu mostrarei como corrigir seu Postfix adequadamente). As senhas são armazenadas em forma criptografada no banco de dados (a maioria dos documentos que encontrei lidava com senhas em texto simples, o que é um risco de segurança). Além disso, este tutorial cobre a instalação do Amavisd, SpamAssassin e ClamAV para que os emails sejam escaneados em busca de spam e vírus. Também mostrarei como instalar o SquirrelMail como uma interface de webmail para que os usuários possam ler e enviar emails e alterar suas senhas.
A vantagem de tal configuração “virtual” (usuários e domínios virtuais em um banco de dados MySQL) é que ela é muito mais eficiente do que uma configuração baseada em usuários de sistema “reais”. Com essa configuração virtual, seu servidor de email pode lidar com milhares de domínios e usuários. Além disso, é mais fácil de administrar porque você só precisa lidar com o banco de dados MySQL ao adicionar novos usuários/domínios ou editar os existentes. Não há mais comandos postmap para criar arquivos db, não há mais recarregamento do Postfix, etc. Para a administração do banco de dados MySQL, você pode usar ferramentas baseadas na web como o phpMyAdmin, que também será instalado neste tutorial. A terceira vantagem é que os usuários têm um endereço de email como nome de usuário (em vez de um nome de usuário + um endereço de email), o que é mais fácil de entender e lembrar.
Este tutorial é destinado a ser um guia prático; não cobre os fundamentos teóricos. Eles são tratados em muitos outros documentos na web.
Este documento vem sem garantia de qualquer tipo! Quero dizer que esta não é a única maneira de configurar tal sistema. Existem muitas maneiras de alcançar esse objetivo, mas este é o caminho que eu sigo. Não dou nenhuma garantia de que isso funcionará para você!
1 Nota Preliminar
Este tutorial é baseado no Ubuntu 14.04 Server (Trusty Tahr), então você deve configurar uma instalação básica do servidor Ubuntu 14.04 antes de continuar com este tutorial. O sistema deve ter um endereço IP estático. Eu uso 192.168.0.100 como meu endereço IP neste tutorial e server1.example.com como o nome do host.
Certifique-se de que você está logado como root (digite
sudo su
para se tornar root), porque devemos executar todas as etapas deste tutorial como usuário root.
É muito importante que você faça /bin/sh um symlink para /bin/bash…
dpkg-reconfigure dash
Usar dash como o shell padrão do sistema (/bin/sh)? <– Não
… e que você desative o AppArmor, se você estiver recebendo apparmor: serviço não reconhecido, então remova-o do update-rc.d
service apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils
2 Instalar Postfix, Courier, Saslauthd, MySQL, phpMyAdmin
Para instalar Postfix, Courier, Saslauthd, MySQL e phpMyAdmin, simplesmente execute
apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql libpam-smbpass
Você será perguntado algumas questões:
Nova senha para o usuário MySQL “root”: <– sua senhadobanco
Repita a senha para o usuário MySQL “root”: <– sua senhadobanco
Criar diretórios para administração baseada na web? <– Não
Tipo geral de configuração de email: <– Internet Site
Nome do sistema de email: <– server1.example.com
Certificado SSL necessário <– Ok
Servidor web para reconfigurar automaticamente: <– apache2
Configurar banco de dados para phpmyadmin com dbconfig-common? <– Não
3 Aplicar O Patch De Quota Ao Postfix
Precisamos obter as fontes do Postfix, aplicar o patch de quota, construir novos pacotes Postfix.deb e instalar esses pacotes .deb:
apt-get build-dep postfix
Às vezes você pode obter um erro como o seguinte:-
root@server1:~# apt-get build-dep postfix
Lendo listas de pacotes… Pronto
Construindo árvore de dependências
Lendo informações de estado… Pronto
E: Você deve colocar alguns ‘source’ URIs em seu sources.list
root@server1:~#
Você pode corrigir isso da seguinte forma, adicionando os repositórios de origem:
vi /etc/apt/sources.list
Faça a entrada como no meu caso:
deb http://archive.ubuntu.com/ubuntu trusty main restricted universe
deb http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe
deb http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
deb http://archive.canonical.com/ubuntu trusty partner
deb-src http://archive.ubuntu.com/ubuntu trusty main restricted universe
deb-src http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe
deb-src http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
deb-src http://archive.canonical.com/ubuntu trusty partner
Em seguida
apt-get update
apt-get build-dep postfix
cd /usr/src
apt-get source postfix
(Certifique-se de usar a versão correta do Postfix nos seguintes comandos. Eu tenho o Postfix 2.11.0 instalado. Você pode descobrir sua versão do Postfix executando
postconf -d | grep mail_version
A saída deve ser assim:
root@server1:/usr/src# postconf -d | grep mail_version
mail_version = 2.11.0
milter_macro_v = $mail_name $mail_version
root@server1:/usr/src#
wget http://vda.sourceforge.net/VDA/postfix-vda-v13-2.10.0.patch
cd postfix-2.11.0
patch -p1 < ../postfix-vda-v13-2.10.0.patch
Em seguida, abra debian/rules e mude DEB_BUILD_HARDENING de 1 para 0:
vi debian/rules
| [...] export DEB_BUILD_HARDENING=0 [...] | |
Se você não fizer isso, sua construção falhará com as seguintes mensagens de erro:
maildir.c: Na função âdeliver_maildirâ:
maildir.c:974:17: erro: formato não é um literal de string e não há argumentos de formato [-Werror=format-security]
maildir.c:977:17: erro: formato não é um literal de string e não há argumentos de formato [-Werror=format-security]
maildir.c:983:17: erro: formato não é um literal de string e não há argumentos de formato [-Werror=format-security]
maildir.c:986:17: erro: formato não é um literal de string e não há argumentos de formato [-Werror=format-security]
maildir.c: Na função âsql2fileâ:
maildir.c:404:25: aviso: ignorando valor de retorno de âreadâ, declarado com atributo warn_unused_result [-Wunused-result]
maildir.c:417:26: aviso: ignorando valor de retorno de âwriteâ, declarado com atributo warn_unused_result [-Wunused-result]
cc1: alguns avisos estão sendo tratados como erros
make: [maildir.o] Erro 1
make: Saindo do diretório `/usr/src/postfix-2.11.0/src/virtual’
make[1]: [update] Erro 1
make[1]: Saindo do diretório `/usr/src/postfix-2.11.0’
make: * [build] Erro 2
dpkg-buildpackage: erro: debian/rules build deu status de saída de erro 2
root@server1:/usr/src/postfix-2.11.0#
Agora podemos construir os novos pacotes Postfix.deb:
dpkg-buildpackage
Agora vamos um diretório acima, é onde os novos pacotes .deb foram criados:
cd ..
O comando
ls -l
mostra os pacotes disponíveis:
root@server1:/usr/src# ls -l
total 6824
drwxr-xr-x 18 root root 4096 Abr 30 04:28 postfix-2.11.0
-rw-r–r– 1 root root 46756 Abr 30 04:28 postfix-cdb_2.11.0-1_amd64.deb
-rw-r–r– 1 root root 142842 Abr 30 04:28 postfix-dev_2.11.0-1_all.deb
-rw-r–r– 1 root root 851842 Abr 30 04:28 postfix-doc_2.11.0-1_all.deb
-rw-r–r– 1 root root 53898 Abr 30 04:28 postfix-ldap_2.11.0-1_amd64.deb
-rw-r–r– 1 root root 48500 Abr 30 04:28 postfix-mysql_2.11.0-1_amd64.deb
-rw-r–r– 1 root root 48610 Abr 30 04:28 postfix-pcre_2.11.0-1_amd64.deb
-rw-r–r– 1 root root 48324 Abr 30 04:28 postfix-pgsql_2.11.0-1_amd64.deb
-rw-r–r– 1 root root 55701 Jun 7 2013 postfix-vda-v13-2.10.0.patch
-rw-r–r– 1 root root 267855 Abr 30 04:27 postfix_2.11.0-1.diff.gz
-rw-r–r– 1 root root 1522 Abr 30 04:27 postfix_2.11.0-1.dsc
-rw-r–r– 1 root root 3885 Abr 30 04:28 postfix_2.11.0-1_amd64.changes
-rw-r–r– 1 root root 1329238 Abr 30 04:28 postfix_2.11.0-1_amd64.deb
-rw-r–r– 1 root root 4034741 Fev 12 01:38 postfix_2.11.0.orig.tar.gz
root@server1:/usr/src#
Escolha os pacotes postfix e postfix-mysql e instale-os assim:
dpkg -i postfix_2.11.0-1_amd64.deb postfix-mysql_2.11.0-1_amd64.deb
4 Criar O Banco De Dados MySQL Para Postfix/Courier
Agora criamos um banco de dados chamado mail:
mysqladmin -u root -p create mail
Você será perguntado:
Digite a Senha: <– sua senhadobanco
Em seguida, vamos para o shell MySQL:
mysql -u root -p
No shell MySQL, criamos o usuário mail_admin com a senha mail_admin_password (substitua pela sua própria senha) que tem privilégios SELECT, INSERT, UPDATE, DELETE no banco de dados mail. Este usuário será usado pelo Postfix e Courier para se conectar ao banco de dados de email:
GRANT SELECT, INSERT, UPDATE, DELETE ON mail. TO ‘mail_admin’@’localhost’ IDENTIFIED BY ‘mail_admin_password’;
GRANT SELECT, INSERT, UPDATE, DELETE ON mail. TO ‘mail_admin’@’localhost.localdomain’ IDENTIFIED BY ‘mail_admin_password’;
FLUSH PRIVILEGES;
Ainda no shell MySQL, criamos as tabelas necessárias pelo Postfix e Courier:
USE mail;
CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
ENGINE=MyISAM;
CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
ENGINE=MyISAM;
CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT ‘10485760’,
PRIMARY KEY (email)
) ENGINE=MyISAM;
CREATE TABLE transport (
domain varchar(128) NOT NULL default ‘’,
transport varchar(128) NOT NULL default ‘’,
UNIQUE KEY domain (domain)
) ENGINE=MyISAM;
quit;
Como você pode ter notado, com o comando quit; saímos do shell MySQL e estamos de volta ao shell do Linux.
A tabela domains armazenará cada domínio virtual que o Postfix deve receber emails (por exemplo, example.com).
| domain |
| example.com |
A tabela forwardings é para aliasar um endereço de email a outro, por exemplo, encaminhar emails para [email protected] para [email protected].
| source | destination |
| [email protected] | [email protected] |
A tabela users armazena todos os usuários virtuais (ou seja, endereços de email, porque o endereço de email e o nome de usuário são os mesmos) e senhas (em forma criptografada!) e um valor de quota para cada caixa de correio (neste exemplo, o valor padrão é 10485760 bytes, o que significa 10MB).
| password | quota | |
| [email protected] | No9.E4skNvGa. (“segredo” em forma criptografada) | 10485760 |
A tabela transport é opcional, é para usuários avançados. Ela permite encaminhar emails para usuários individuais, domínios inteiros ou todos os emails para outro servidor. Por exemplo,
| domain | transport |
| example.com | smtp:[1.2.3.4] |
encaminharia todos os emails para example.com via o protocolo smtp para o servidor com o endereço IP 1.2.3.4 (os colchetes [] significam “não faça uma busca do registro MX DNS” (o que faz sentido para endereços IP…). Se você usar um nome de domínio totalmente qualificado (FQDN) em vez disso, você não usaria os colchetes.).
A propósito, (estou assumindo que o endereço IP do seu sistema de servidor de email é 192.168.0.100) você pode acessar o phpMyAdmin em http://192.168.0.100/phpmyadmin/ em um navegador e fazer login como mail_admin. Então você pode dar uma olhada no banco de dados. Mais tarde, você pode usar o phpMyAdmin para administrar seu servidor de email.
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.