Este artigo foi escrito durante o processo de configuração, portanto inclui alertas para erros que cometi (muitos comuns a iniciantes) e que me fizeram perder um tempão tentando descobrir o que era. Não sou um expert no assunto, ainda assim, estou postando aqui para que outros possam fazer disso uma tarefa mais branda, pois encontrei muitos 'buracos' e 'detalhes sem explicação' nos artigos que li. Este tutorial visa uma cobertura completa do básico no assunto.
1. Pré-requisitos
Para executar esse tutorial, deve-se ter um Debian (ou derivado) de 32bits, e os pacotes do apache, php, e postgresql 8.3 instalados e configurados. A questão de ser Debian 32 foi que encontrei um erro no courier-imap que não consegui contornar na versão 64 bits, e como já tinha feito o processo numa máquina-cobaia com Debian 5.0/32bits, optei por usar também essa distribuição para o servidor.
Obs.: Para instalação de pacotes eu uso aptitude (melhor verificação de dependências), mas o apt-get pode ser usado no lugar dele.
2. Instalação do Postfix
O Morimoto escreveu um excelente guia em:
Para a configuração inicial do Postfix é interessante dar uma olhada nessa referência. Bem, dito isso, vamos instalar os pacotes:
# aptitude install postfix postfix-ldap postfix-pgsql
Importante: a configuração, se não for feita na instalação, deve ser feita com o comando:
# dpkg-reconfigure postfix
Como opções, deve-se escolher:
General type of configuration?
-> Internet site (para um servidor 'real' de e-mails)
Conta de usuário admin:
-> fulano
mail name? (Nome do servidor de e-mails)
-> meudominio.com.br ou nome_do_meu_servidor
Destinatários para os quais aceitar emails: (Essencial se o servidor abrigar domínios virtuais)
-> dominio1.com.br, domínio2.org, domínio3.net
Force synchronous update on mail queue?
-> Não
Qualquer dúvida, consultar os passos indicados no artigo do Morimoto para instalação e configuração iniciais do Postfix.
Finalizada a instalação, vamos fazer alguns testes.
É bom fazermos uma checagem geral com o comando:
# postfix check
Se houverem problemas aparecerão aqui, do contrário, não aparecerá nada.
Envio e recebimento por telnet (instale o telnet se não tiver com '
aptitude install telnet'):
2.a) Envio para serviço de email local:
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 urano.meudominio.com.br ESMTP Postfix (Debian/GNU)
mail from: usuario@meudominio.com.br
250 2.1.0 Ok
rcpt to: usuario@meudominio.com.br
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
teste de envio de email de urano.
.
250 2.0.0 Ok: queued as B5966E0EE
quit
221 2.0.0 Bye
Connection closed by foreign host.
Obs.: Pode-se instalar e usar o mutt para ler (aptitude install mutt / mutt).
2.b) Envio para serviço de email externo:
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 urano.meudominio.com.br ESMTP Postfix (Debian/GNU)
mail from: usuario@meudominio.com.br
250 2.1.0 Ok
rcpt to: email_de_teste@yahoo.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
teste de envio de email de urano.
.
250 2.0.0 Ok: queued as B5966E0EE
quit
221 2.0.0 Bye
Connection closed by foreign host.
O Postfix deve funcionar normalmente nas configurações padrão. Se estiver ok, vamos em frente. Se não, o problema tem que ser corrigido antes de prosseguir. Dica: dê uma olhada nos logs de sistema ('cat /var/log/syslog') e de email ('cat /var/log/mail.err ou mail.*') para ter algumas pistas dos problemas.
[1] Comentário enviado por
doomk em 06/10/2010 - 16:30h:
Excelente Artigo.
Achei bem interessante a integração dele com o Postgree, até então só tinha visto para o MySQL.
Foi para o favoritos.
Forte abraço.
[2] Comentário enviado por
isoares em 07/10/2010 - 15:13h:
Oi, doomk!
Obrigado. Esse artigo surgiu da minha dificuldade em instalar essa combinação de softwares. Na primeira tentativa, fiquei umas tres semanas, sem conseguir. Dava de cara com uma série de problemas, oriundos da minha falta de experiência no assunto e de conhecimento sobre esses esquemas de autenticação que citei. Resolvi então, durante a última tentativa, documentar tudo, pra virar artigo. Assim, outros e eu mesmo poderíamos consultar posteriormente.
A escolha do Postgres foi devida ao fato de que o utilizo como meu servidor padrão - desde sempre - de banco de dados. O Mysql pode ser mais rápido para determinadas tarefas, mas o Postgres é de longe mais completo. Claro, o foco de cada um deles é diferente.
Quando eu estudava na UFPR, um rapaz fez um estudo para o uso do Postgres para se montar um Datawarehouse (um banco de dados que armazena bancos de dados, como é feito no sistema bancário). A comparação do Postgres com os demais softwares, mesmo proprietários, me impressionou. Por isso, desde então, o adotei como servidor padrão.
Realmente, eu achei muita coisa envolvendo essa combinação com o Mysql no lugar do postgres, tive que dar uma boa garimpada para achar algo útil, mas, valeu a pena. Fico feliz que tenha gostado.
É possível que, futuramente, eu poste algumas melhorias, quando as tiver implementado.
Um forte abraço!
Isaias.
[3] Comentário enviado por
renanrodrigues em 30/10/2010 - 04:02h:
Muito obrigado estava procurando um artigo desse você tirou minha duvida movendo para favoritos obrigado.
[4] Comentário enviado por
doomk em 09/11/2010 - 15:27h:
Muito Legal.
Acabei de concluir a configuração de um servidor de e-mail baseando em seu tutorial, funcionou que uma beleza.
E mais, juntei também com o tutorial do nosso grande amigo douglashx, que nos mostrou como fazer um cluster, baseando nas soluções Heartbeat + DRBD8 + OCFS2 + MONIT + LVS.
http://www.vivaolinux.com.br/artigo/Alta-disponibilidade-com-Debian-Lenny-+-Heartbeat-+-DRBD8-+-OCFS...
Enfim, após bater um pouco de cabeça, está configurado um servidor de e-mail Postfix + Postgree + Roundcube + Heartbeat + Drbd8 + Ocfs2.
Muito bom.
Obrigado mais uma vez pela sua dedicação na elaboração deste valioso tutorial.
[5] Comentário enviado por
geraldoquites em 06/12/2010 - 11:23h:
Bom dia "isoares" vou fazer a minha instalação geral usando o seu artigo. Estou usando o OpenSuse 11.3. Depois te dou retorno sobre as sequencias. Grande abraço, Geraldo.
[6] Comentário enviado por
isoares em 06/12/2010 - 22:33h:
Olá doomk!
Obrigado, procurei fazer o mais detalhado possível. A configuração que vc montou deve ter ficado ótima, sem comentários, hehehe!
Fico muito grato e mesmo incentivado a escrever novos tutoriais, com esse feedback da comunidade!
Um forte abraço!
Isaias.
[7] Comentário enviado por
isoares em 06/12/2010 - 22:36h:
Oi, Geraldo (geraldoquites)!
Bem, como você pode ver, esse tutorial foi elaborado para debian e derivados, mas creio que funcionará bem para outras distros também. Você vai ter, claro, que adaptar alguns passos, mas o esquema de configuração deve ser muito similar (se não idêntico), então, deve dar certo. Creio que o tutorial está detalhado o bastante para te permitir essa liberdade, com a plena compreensão dos passos que são necessários (configurações, autenticações, enfim). Fico aguardando pelo resultado! Boa sorte!
Um forte abraço!
Isaias.
[8] Comentário enviado por
striteiro em 31/12/2010 - 09:39h:
Bom dia, segui a risca o tutorial, instalei e configurei tudo como manda o artigo, porem quando tento logar via webmail, me retorna o seguinte erro: A ligacao com o servidor IMAP falhou!
Alguem tem uma luz ?
desde ja, agradeco!=D
[9] Comentário enviado por
isoares em 05/01/2011 - 00:25h:
Olá, striteiro!
Bem, você deve ficar atento a todas as recomendações do artigo. Esse tipo de erro que você menciona é percebido quando se faz os testes de autenticação, via telnet. O artigo menciona ainda a verificação dos erros nos logs (/var/log/syslog). Várias coisas podem dar errado, poste as mensagens, logs e o que mais puder.
Um forte abraço!
Isaias.
[10] Comentário enviado por
andredemetriods em 04/03/2011 - 09:31h:
Bom dia Amigo,
Cheguei até o passo:
Agora vamos criar o usuário postfix no postgre, com a mesma senha que colocamos no script:
# su - postgres
Quando dou este comando, o shell me retorna:
ID desconhecido : postgres
Tens idéia do que pode ter acontencido?
Att,
[11] Comentário enviado por
isoares em 17/04/2011 - 20:16h:
Olá, andredemetriods!
O usuário postgres é geralmente criado quando se instala o posgtres (pois ele é o usuário administrador do banco de dados). Se você instalou o Postgres e não possui esse usuário, das duas uma, ou seu usuário administrador está com outro nome, ou precisa reconfigurar o postgres novamente. Isso poderia ser feito com o gerenciador de pacotes, com o comando 'dpkg-reconfigure postgresql'.
Qualquer coisa, estou à disposição!
Um forte abraço!
Isaias
[12] Comentário enviado por
alexandrehrs em 11/07/2011 - 10:41h:
Na minha empresa uso o roudcube, porem presico remover o acesso webmail de alguns usuarios e não sei como fazer. Alguem pode me ajudar.
[13] Comentário enviado por
isoares em 19/07/2011 - 09:49h:
Oi, Alexandre! (alexandrehrs)
Bem, imagino que você esteja falando de usuários reais, cadastrados na máquina onde roda o servidor de email. Para conseguir isso, terá de trabalhar no sistema de autenticação, pois é esse sistema que libera o acesso ao sistema de e-mail.
Veja, se vc tiver usuários virtuais, é fácil, é só removê-los do banco de dados. Nesse caso, creio que, talvez, se você tiver muita experiência em autenticação, consiga isso. Eu não saberia como realizar essa tarefa, enfim, apenas uma idéia acerca disso. Você teria de criar um script de autenticação que permitisse todos, menos os usuários indesejados, um por um.Mas ao mesmo tempo, isso bloquearia também o acesso remoto do usuário à máquina. O fato de que o usuário seja um usuário real na máquina complica bastante as coisas. Na minha opinião, é mais fácil manter o servidor de e-mail em uma máquina separada, na qual esses usuários não tenham acesso, enfim. Desse modo, vc pode configurar do modo que descrevi e ter controle total de quem vai utilizar o sistema.
Um forte abraço!
Isaias.
[14] Comentário enviado por
aldopassos em 27/10/2011 - 10:04h:
Bom dia amigo, estou com um problema e queria ver se alguem pode me dar uma luz, estamos com um servidor instalado com debian e postifix rodando normalmente enviando e recebendo de todos os principais servidores de e-mail (TERRA, YAHOO, HOTMAIL) porém há um específico que não consegue nos enviar mensagens, este servidor eu sei que utiliza o EXCHANGE e sempre que nos enviam mensagens o e-mail volta deizendo que não foi possível realizar a entrega e no meu servidor ela nem aparece, nem sequer no mail.log...
Se puder me dar uma luz do que posso fazer para resoolver o problema... Muito obrigado por enquanto...
[15] Comentário enviado por
rodrigo.a.sc em 18/11/2011 - 15:34h:
Tenho uma grande duvida sobre o PostFix.
Como eu verifico o tamanho da conta de alguem ?
Crio uma conta via linha de comando?
faço o backup e o restore de uma caixa postal ??
Restarto apenas um serviço, tipo pop, smtp pois pelo zmcontrol so consigo restartar tudo de uma so vez até onde eu sei.
zmcontrol status
zmcontrol stop
zmcontrol start
so sei até ai.
Se alguem puder me dar um bizu ai eu fico grato!
[16] Comentário enviado por
isoares em 29/11/2011 - 19:54h:
Oi, aldopassos!
Então, difícil de dizer. Não entendo quando você diz que 'o servidor usa exchange', pois o uso do exchange, pelo que sei, utiliza um provedor de email para acesso. Pode ser um problema de configuração na máquina que está te enviando o email, pois, como você mesmo disse, nem aparece nos logs, ou seja, do meu ponto de vista, seu servidor parece estar ok, o indivíduo que está te enviando a mensagem é que tem que checar suas configurações, imagino.
Um forte abraço!
Isaias.
[17] Comentário enviado por
isoares em 29/11/2011 - 21:12h:
Oi, rodrigo.a.sc!
O 'tamanho da conta' é o tamanho do diretório que contém as mensagens do usuário.
Tenho um script para criar contas. Com ele dá para criar uma conta via linha de comando.
Eu criei uma mailbox 'template', que é um modelo do que eu queria (adicionei pasta de enviados
e tudo o que queria no roundcube), e a copio para a nova pasta do usuário. Tem um comando para
criar mailbox, que eu não cito aqui, mas que pode ser encontrado via google. Segue o script:
criar_usuario_virtual.sh:
---------------------------------------------------------------------------------------------------------------------
#!/bin/bash
# Script para criacao de usuarios virtuais para acesso ao webmail
#echo "[$1][$2]"
senha=""
if [[ ($1 != "") && ($2 != "") ]]; then
senha=$2
fi
if [[ "$1" == "" ]]; then
echo ""
echo "Sintaxe: ./criar_usuario_virtual.sh <login> <senha>"
echo ""
exit 1
fi
if [[ $senha == "" ]]; then
chave=`authpasswd`
else
chave=`echo "$senha"|authpasswd`
fi
chave=${chave//$/\\$}
login="$1"
echo "Tentando inserir usuario: [$login], chave: [$chave]">> /diretorio_mail_usuarios_virtuais/virtual.log
rsync -ar /diretorio_mail_usuarios_virtuais/template /diretorio_mail_usuarios_virtuais/$login
if [[ ! -d "/diretorio_mail_usuarios_virtuais/vusers/$login" ]]; then #Verifica se o diretório foi criado
echo "ERRO: Nao foi possivel criar o diretorio. Abortando.">> /diretorio_mail_usuarios_virtuais/virtual.log
exit 1
fi
chown -R postfix:postfix /diretorio_mail_usuarios_virtuais/$login
sql=`printf "INSERT INTO mailbox (username, password, name, maildir, quota, domain, created, modified, active) VALUES ('$login@seudominio.com', '$chave', ' ', '$login/', '0', ' ', current_timestamp, current_timestamp, '1');" `
comando=`printf "psql -d mail -c \"$sql\""`
result=`su -l usuario_autorizado_a_inserir_no_postgres -s /bin/bash -c "$comando"`
if [[ $result != "INSERT 0 1" ]]; then
echo "Falha na insercao do usuario no Postgres. Abortando.">>/diretorio_mail_usuarios_virtuais/virtual.log
exit 1
else
echo "Usuario [$login] inserido com sucesso."
echo "Usuario adicionado com sucesso: $login $senha $chave">>/root/virtuais.txt # grava um log
echo ""
fi
---------------------------------------------------------------------------------------------------------------------
E também tem um script para remover a conta (não apaga as mensagens, só remove do banco de dados. Claro,
pode ser modificado para fazer o que você desejar também:
apagar_usuario_virtual.sh:
---------------------------------------------------------------------------------------------------------------------
#!/bin/bash
# Script para apagar usuarios virtuais do acesso ao webmail
senha=""
if [[ ($1 != "") && ($2 != "") ]]; then
senha=$2
fi
if [[ "$1" == "" ]]; then
echo ""
echo "Sintaxe: ./apagar_usuario_virtual.sh <login>"
echo ""
exit 1
fi
login="$1"
echo "Tentando remover usuario: [$login]">> /diretorio_mail_usuarios_virtuais/virtual.log
sql=`printf "DELETE FROM mailbox WHERE maildir='$login/'"`
comando=`printf "psql -d mail -c \"$sql\""`
result=`su -l usuario_autorizado_a_inserir_no_postgres -s /bin/bash -c "$comando"`
if [[ $result != "DELETE 0 1" ]]; then
echo "Falha na insercao do usuario no Postgres. Abortando.">>/diretorio_mail_usuarios_virtuais/virtual.log
exit 1
else
echo "Usuario [$login] removido com sucesso."
echo "Usuario removido com sucesso: $login $senha $chave">>/root/virtuais.txt # grava um log
echo ""
fi
---------------------------------------------------------------------------------------------------------------------
Dá para fazer o backup e restore normalmente, como em qualquer diretório, se necessário.
Quanto aos serviços, é sempre bom reestartar tudo, para assegurar que as modificações estão valendo.
Ah, detalhes: os scripts são executados como root.
E é necessário configurar a conta de algum usuário para dar a ele acesso ao postgres, de inserção e remoção no banco de usuários virtuais.
Qualquer dúvida, estamos aí, é só perguntar.
Isaias.
[18] Comentário enviado por
isoares em 26/12/2011 - 19:59h:
Só esclarecendo: no contexto do artigo, um 'usuário virtual' é um usuário que está cadastrado no sistema de email, mas não tem uma 'conta real' na máquina, isto é, não tem uma área 'home', nem senha, nem poderia logar via ssh, por exemplo. Esse método aumenta bastante a segurança do servidor, uma vez que há menos brechas de segurança a serem exploradas. Os dados do usuário virtual são armazenados num banco de dados, e o sistema de autenticação realiza a consulta no banco, no caso, o Postgre, e então valida o acesso.
Um forte abraço a todos!
Isaias.
[19] Comentário enviado por
JZG em 09/02/2012 - 10:30h:
Bom dia,
estou tendo de instalar o servidor de email baseado em seu tutorial. Porém quando tento logar com 'useradmin' pelo comando #su useradmin é retornada a seguinte mensagem:
"unknown id: useradmin"
O usuário existe, quando fui cria-lo novamente me é enviada que "não é possivel executar a ação por que o usuário já existe".
O que pode ser?
[20] Comentário enviado por
isoares em 10/02/2012 - 20:06h:
Oi, JZG!
Não entendi bem a sua pergunta, poderia ser mais específico? Bem, o tutorial trata de usuários virtuais, então, esses usuários são criados no banco de dados (outro dia postei um script que faz isso). Esse sistema é justamente para evitar que usuários do email sejam usuários reais na máquina, criando posśiveis brechas de segurança.
Qualquer dúvida, posta novamente, que estamos aí..
Isaias.
[21] Comentário enviado por
melorymonie em 21/03/2012 - 17:11h:
Estou criando (tentando, pelo menos) um servidor de e-mail seguindo o seu tutorial, mas quando cheguei na parte de testar a conexão do imap me ocorreu o seguinte problema:
telnet 0 143
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION STARTTLS] Courier-IMAP ready. Copyright 1998-2010 Double Precision, Inc. See COPYING for distribution information.
0 login user@teste.br teste
* BYE [ALERT] Fatal error: No such file or directory: No such file or directory
Connection closed by foreign host
olhando no log ele encontra o usuário no banco de dados, tudo certinho, mas no final do log encontrei o seguinte erro:
Mar 21 16:47:26 webmail2 imapd: chdir user/: No such file or directory
Mar 21 16:47:26 webmail2 imapd: user@teste.br: No such file or directory
Ai eu te pergunto, quando tenho que criar os maildirmake:
# maildirmake /home/postfix/Maildir/user
# maildirmake /home/postfix/Maildir/admin
# chown -R postfix:postfix /home/postfix
O meu usuário postfix tem que ter uma área de home?
Ou devo criar os diretórios em /var/users?
***************************************************
Segunda questão:
Quando testo o segundo telnet, me ocorre o seguinte erro:
telnet teste.br 110
telnet: could not resolve teste.br/110: Name or service not known
Você saberia me dizer porque isso ocorre?
Estou utilizando uma máquina virtual para realizar os testes, não tendo um IP real para isso, pode ter alguma coisa haver?
Obrigado e parabéns pelo post.