Postfix + MySQL + Courier + Webmail AfterLogic + Postfixadmin + Quota + Debian Wheezy

Objetivo desse How To, precisamos instalar e configurar o Postfix trabalhando com a sua autenticação no MySQL, vou abordar também a instalação e a configuração do servidor Courier que podemos utilizar para Pop e Imap ele vai utilizar a mesma base do Postfix para autenticar os usuários, para o gerenciamento de contas de Emails e domínios vamos utilizar o Postfixadmin, vou abordar a instalação e configuração do AfterLogic Webmail.

Prepare o seu sistema com o seguinte script Easy-Debian para que não falte nenhum pacote ou configuração.

  • Nome do servidor: mail.douglasqsantos.com.br
  • IP do servidor: 192.168.1.70/24
  • Gateway: 192.168.1.1
  • DNS: 8.8.8.8 e 8.8.4.4
  • RAM: 2 GB
  • Processador: 2 Núcleos

Download e Instalação do Postfix e Patch para Quota

Para a instalação é necessário que o sistema esteja atualizado. Para isto execute os comandos abaixo:

aptitude update && aptitude dist-upgrade -y

Agora vamos obter o código fonte do postfix

cd /usr/src
apt-get source postfix

Agora vamos obter o nosso patch

wget -c http://wiki.douglasqsantos.com.br/Downloads/mail/postfix-vda-v13-2.10.0.patch

Agora vamos ajustar a versão do postfix no patch, se utilizar o patch 2.9.6 o debian não consegue gerar o pacote por causa de um erro no vonte virtual.c

sed -i 's/2.10.0/2.9.6/g' /usr/src/postfix-vda-v13-2.10.0.patch

Agora vamos aplicar o patch no postfix

cd /usr/src/postfix-2.9.6 && patch -p1 < /usr/src/postfix-vda-v13-2.10.0.patch
(Stripping trailing CRs from patch.)
patching file README_FILES/VDA_README
(Stripping trailing CRs from patch.)
patching file src/global/mail_params.h
Hunk #1 succeeded at 2360 (offset -7 lines).
(Stripping trailing CRs from patch.)
patching file src/util/file_limit.c
(Stripping trailing CRs from patch.)
patching file src/virtual/mailbox.c
(Stripping trailing CRs from patch.)
patching file src/virtual/maildir.c
(Stripping trailing CRs from patch.)
patching file src/virtual/virtual.c
(Stripping trailing CRs from patch.)
patching file src/virtual/virtual.h

Agora vamos ajustar as variáveis do debian para a instalação do postfix

export DEBIAN_PRIORITY=critical
export DEBIAN_FRONTEND=noninteractive

Montagem do pacote do Postfix

Agora que já obtemos o pacote do Postfix e aplicamos o patch precisamos instalar as dependências para compilar o pacote.

aptitude update && apt-get build-dep postfix -y

Agora vamos criar os pacotes .deb

cd /usr/src/postfix-2.9.6 
dpkg-buildpackage
cd ../
apt-get remove --purge postfix -y
dpkg -i postfix_*.deb

Agora vamos instalar os pacotes adicionais necessários.

dpkg -i postfix-*.deb

Agora vamos voltar as variáveis ao padrão

unset DEBIAN_PRIORITY
unset DEBIAN_FRONTEND

Será instalado agora o mailx que é o tradicional agente de mail do utilizador de linha de comandos.

aptitude install bsd-mailx

Agora vamos ajustar o Debian para ele não atualizar o postfix e sobreescrever o nosso postfix com patch

vim /etc/apt/preferences
#Pacote core do postfix
Package: postfix
Pin: release a=stable
Pin-Priority: -1

#Pacotes adicionais do postfix
Package: postfix-*
Pin: release a=stable
Pin-Priority: -1

Ajuste de alguns parâmetros do sistema

Nome e ip do servidor

vim /etc/hosts
127.0.0.1       localhost
192.168.1.70     mail.douglasqsantos.com.br    mail

Agora vamos acertar o hostname

vim /etc/hostname
mail.douglasqsantos.com.br

Agora vamos acertar o mailname do servidor

vim /etc/mailname
mail.douglasqsantos.com.br

Agora vamos reiniciar o servidor para acertar o resto do sistema

reboot

Instalação do Apache e MySQL para a utilização do Postfixadmin

aptitude update && aptitude dist-upgrade -y
aptitude install mysql-server mysql-client apache2 php5 php5-mysql php5-imap libpam-mysql -y

Será solicitado a senha do banco de dados, informe e confirme ela. Agora precisamos instalar alguns pacotes para que o postfixadmin funcione corretamente

aptitude install php5-gd php5-mcrypt php5-json php5-xmlrpc php5-dev php5-common \
libapache2-mod-php5 php-pear php5-intl php5-curl -y

Criação do banco de dados dos usuários de e-mail

mysql -u root -p
CREATE DATABASE mail;
GRANT ALL PRIVILEGES ON mail.* TO mail@localhost IDENTIFIED BY "123";
FLUSH PRIVILEGES;
quit;

Instalação e configuração do PostFixAdmin

Vamos obter o postfixadmin

cd /var/www
rm -rf *
wget -c http://wiki.douglasqsantos.com.br/Downloads/mail/postfixadmin-2.3.6.tar.gz
tar -xzvf postfixadmin-2.3.6.tar.gz
mv postfixadmin-2.3.6 postfixadmin
rm -rf postfixadmin-2.3.6*
chown -R www-data:www-data *

Faça as alterações necessárias para o postfixadmin, aqui o que você vai precisar mudar com certeza é douglasqsantos.com.br que é o domínio e a senha que eu coloquei como 123 ;)

sed -i "s/change-this-to-your.domain.tld/douglasqsantos.com.br/g" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['configured'\] = false;/\$CONF\['configured'\] = true;/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['default_language'\] = 'en';/\$CONF\['default_language'\] = 'pt-br';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['database_user'\] = 'postfix';/\$CONF\['database_user'\] = 'mail';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['database_password'\] = 'postfixadmin';/\$CONF\['database_password'\] = '123';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['database_name'\] = 'postfix';/\$CONF\['database_name'\] = 'mail';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['domain_path'\] = 'NO';/\$CONF\['domain_path'\] = 'YES';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['domain_in_mailbox'\] = 'YES';/\$CONF\['domain_in_mailbox'\] = 'NO';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['quota'\] = 'NO';/\$CONF\['quota'\] = 'YES';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['transport'\] = 'NO';/\$CONF\['transport'\] = 'YES';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['vacation'\] = 'NO';/\$CONF\['vacation'\] = 'YES';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['emailcheck_resolve_domain'\]='YES';/\$CONF\['emailcheck_resolve_domain'\]='NO';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['used_quotas'\] = 'NO';/\$CONF\['used_quotas'\] = 'YES';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['new_quota_table'\] = 'NO';/\$CONF\['new_quota_table'\] = 'YES';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['maxquota'\] = '10';/\$CONF\['maxquota'\] = '10000';/" /var/www/postfixadmin/config.inc.php

Insira as configurações adicionais do vacation no final do arquivo config.inc.php

sed -i "s/'relay'/'relay',/" /var/www/postfixadmin/config.inc.php
sed -i "/relay/ a 'vacation'" /var/www/postfixadmin/config.inc.php

Reinicie o serviço do Apache

/etc/init.d/apache2 restart

Acesse pelo seu navegador o menu de configuração do PostfixAdmin para terminar a instalação pelo endereço: http://ip_servidor/postfixadmin/setup.php

  • Na primeira tela ele irá fazer a verificação se todos os critérios para funcionar estão intalados e funcionando.
  • No final da página, informe a senha para de acesso como administrador
  • Depois de alterada a senha, ele vai mostrar a linha com a senha, copie a linha e substitua a linha no arquivo config.inc.php
vim /var/www/postfixadmin/config.inc.php
 In order to setup Postfixadmin, you MUST specify a hashed password here.
 To create the hash, visit setup.php in a browser and type a password into the field,
 on submission it will be echoed out to you as a hashed value.
#$CONF['setup_password'] = 'changeme';
$CONF['setup_password'] = '0faa114f15c60534ff34a8248dfaeafc:0c7fcd264027316b45619a99af58f25a1cb1b130';

Depois de alterado o arquivo, volte na tela do postfixadmin e informe o e-mail do aministrador e a senha, para testar a autenticação. Agora vamos continuar a nossa configuração.

Agora vamos remover o setup.php

rm -rf /var/www/postfixadmin/setup.php

Vacation

O Vacation funciona para gerenciar as mensagens de ausência ou ferias do usuários. Útil quando você sai de férias por exemplo e não vai ler e-mails por um tempo e deixa uma mensagem pré-definida com as informações sobre as pessoas que vão ser contactadas no tempo que você estará fora. Preparando o ambiente:

Vamos criar o grupo e o usuário vacation

groupadd vacation
useradd -d /var/spool/vacation -g vacation -s /bin/false -m vacation

Agora vamos copiar o arquivo do vacation para o seu home

cp /var/www/postfixadmin/VIRTUAL_VACATION/vacation.pl /var/spool/vacation/

Agora vamos criar o diretório que vai armazenar os logs e acertar as permissões dos diretórios e arquivos

mkdir /var/log/vacation/
chown -R vacation:vacation /var/spool/vacation/
chown -R vacation:vacation /var/log/vacation/
chmod 750 /var/spool/vacation/
chmod 700 /var/spool/vacation/vacation.pl
touch /var/log/vacation.log
chown vacation:vacation /var/log/vacation.log

Agora vamos instalar as dependências para o vacation funcionar corretamente

aptitude install libmail-sender-perl libemail-valid-perl libmime-tools-perl liblog-log4perl-perl liblog-dispatch-perl -y
aptitude install libgetopt-argvfile-perl libmime-charset-perl libmime-encwords-perl libdbd-pg-perl -y

Vamos acertar as configurações no arquivo vacation.pl

vim /var/spool/vacation/vacation.pl
[...]
#our $db_type = 'Pg'; ->temos que comentar essa linha
our $db_type = 'mysql';
 
# leave empty for connection via UNIX socket
our $db_host = '';
 
# connection details
our $db_username = 'mail';
our $db_password = '123';
our $db_name     = 'mail';
 
our $vacation_domain = 'autoreply.douglasqsantos.com.br';
 
[...]
our $syslog = 1;
our $log_to_file = 1; 

[...]
my $interval = 1*1*1;
# disabled by default
#our $interval = 0; -> comentar essa linha e deixar my $interval = 60*60*24;

Agora vamos criar dois domínios um principal e um domínio para o vacation que vão ser as auto repostas de ferias ou ausência. Logue na tela web http://ip_servidor/postfixadmin

  • Selecione Domínios/Criar domínio
  • Agora informe o domínio
  • A sua descrição
  • Informe uma cota ou deixe ela como 0
  • Transporte deixe o virtual
  • Selecione Adicionar aliases padrão
  • E selecione Criar domínio
  • Agora vamos criar o domínio do vacation
  • Domínio agora vai ser autoreply.douglasqsantos.com.br “douglasqsantos.com.br” é o domínio anteriormente criado
  • Coloque uma descrição para ele exemplo domínio de ferias
  • Selecione em transporte como vacation
  • Selecione criar domínio
  • Pode sair dessa tela.

Configuração do Postifx

Vamos instalar os módulos que serão usados para autenticação.

aptitude install libsasl2-2 libsasl2-modules-sql -y
aptitude install libsasl2-modules libsasl2-dev sasl2-bin openssl   -y

Agora vamos obter o gid do Postfix

grep postfix /etc/passwd
postfix:x:104:107::/var/spool/postfix:/bin/false

Como podemos notar o gid do postfix é 107 esse valor vai ser usado para criarmos o vmail que vai ser responsável pelas mensagens e pela identificação dos modulos do courierauthmysql

adduser --system --shell /bin/false --uid 107 --gid 107 vmail
Adicionando usuário de sistema 'vmail' (UID 107) ...
Adicionando novo usuário 'vmail' (UID 107) com grupo 'postfix' ...
Criando diretório pessoal '/home/vmail' ...

Agora vamos acertar as permissões do diretório do vmail

chown -R vmail:postdrop /home/vmail

Vamos fazer um backup do arquivo original

cp -Rfa /etc/postfix/main.cf{,.bkp}

Agora vamos configurar o nosso postfix

vim /etc/postfix/main.cf
#---------------------------------MAIN-----------------------------------------
smtpd_banner                    = $myhostname ESMTP
biff                            = no
append_dot_mydomain             = no
readme_directory                = no
alias_maps                      = hash:/etc/postfix/aliases
alias_database                  = hash:/etc/postfix/aliases
myhostname                      = mail.douglasqsantos.com.br
mydomain                        = douglasqsantos.com.br
myorigin                        = $myhostname
mydestination                   = $myhostname, localhost
relayhost                       =
mynetworks                      = 127.0.0.0/8, 192.168.1.0/24 [::ffff:127.0.0.0]/104 [::1]/128
relay_domains                   = $mydestination
home_mailbox                    = Maildir/
mailbox_command                 = /usr/bin/procmail -a "$EXTENSION" DEFAULT=$HOME/Maildir/ MAILDIR=$HOME/Maildir/
mailbox_size_limit              = 0
message_size_limit              = 10240000
recipient_delimiter             = +
mynetworks_style                = subnet
inet_interfaces                 = all
default_transport               = smtp
smtpd_recipient_limit           = 30
bounce_queue_lifetime           = 300s
maximal_queue_lifetime          = 300s
#-----------------------------END MAIN-----------------------------------------
#-----------------------------SASL--------------------------------------------- 
smtpd_sasl_auth_enable          = yes
smtpd_sasl_security_options     = noanonymous
broken_sasl_auth_clients        = yes
smtpd_sasl_local_domain         = $mydomain
#----------------------------END SASL------------------------------------------
#-------------------------------TLS--------------------------------------------
smtp_tls_CAfile                 = /etc/postfix/ssl/cacert.pem
smtp_tls_cert_file              = /etc/postfix/ssl/smtpd.crt
smtp_tls_key_file               = /etc/postfix/ssl/smtpd.key
smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_tls_session_cache
smtp_tls_security_level         = may
smtpd_tls_CAfile                = /etc/postfix/ssl/cacert.pem
smtpd_tls_cert_file             = /etc/postfix/ssl/smtpd.crt
smtpd_tls_key_file              = /etc/postfix/ssl/smtpd.key
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_session_cache
smtpd_tls_dh1024_param_file     = /etc/postfix/ssl/dh_1024.pem
smtpd_tls_dh512_param_file      = /etc/postfix/ssl/dh_512.pem
smtpd_tls_security_level        = may
smtpd_tls_received_header       = yes
smtpd_tls_ask_ccert             = yes
smtpd_tls_loglevel              = 1
tls_random_source               = dev:/dev/urandom
smtpd_enforce_tls               = yes
#-----------------------------END TLS-------------------------------------------- 
#--------------------------------MYSQL------------------------------------------- 
transport_maps                  = proxy:mysql:/etc/postfix/mysql_transport_maps.cf
virtual_alias_maps              = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_domains         = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps            = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_transport               = virtual
virtual_minimum_uid             = 107
virtual_uid_maps                = static:107
virtual_gid_maps                = static:107
virtual_mailbox_base            = /home/vmail
#-----------------------------END MYSQL------------------------------------------- 
#-----------------------------QUOTA-----------------------------------------------
virtual_mailbox_limit           = 51200000
virtual_mailbox_limit           = 0
virtual_maildir_extended        = yes
virtual_mailbox_limit_override  = yes
virtual_mailbox_limit_maps      = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_overquota_bounce        = yes
virtual_maildir_limit_message   = Desculpe, o diretorio de correio do usuario estourou sua quota, por favor tente novamente depois.
#----------------------------END QUOTA-------------------------------------------
#----------------------------CONTROLS--------------------------------------------
smtpd_helo_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_invalid_hostname,
 reject_unknown_hostname,
 reject_non_fqdn_hostname,
 reject_unauth_pipelining
 
smtpd_client_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_unauth_pipelining,
 reject_rbl_client dnsbl.sorbs.net,
 reject_rbl_client rbl.schulte.org,   
 reject_rbl_client dnsbl.anticaptcha.net,
 reject_rbl_client bl.spamcannibal.org,
 reject_rbl_client bl.spamcop.net,
 reject_rbl_client cart00ney.surriel.com,
 reject_rbl_client korea.services.net,
 reject_rbl_client cbl.abuseat.org,
 reject_unknown_client
 
smtpd_sender_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_non_fqdn_sender,
 reject_unauth_pipelining,
 reject_unknown_sender_domain,
 
smtpd_recipient_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_invalid_hostname,
 reject_non_fqdn_hostname,
 reject_non_fqdn_recipient,
 reject_unauth_destination,
 reject_unauth_pipelining,
 reject_unknown_recipient_domain,
 reject_unknown_client
#------------------------END CONTROLS-------------------------------------------

Geração das chaves para a conexão via TLS no Postfix

Vamos gerar as chaves de autenticação

mkdir /etc/postfix/ssl
cd /etc/postfix/ssl/
openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024
52 semi-random bytes loaded
Generating RSA private key, 1024 bit long modulus
.......++++++
...............................................................++++++
e is 65537 (0x10001)
Enter pass phrase for smtpd.key: senha
Verifying - Enter pass phrase for smtpd.key: senha

Acertando permissão da key gerada

chmod 600 smtpd.key

Agora vamos gerar o pedido de assinatura

openssl req -new -key smtpd.key -out smtpd.csr
Enter pass phrase for smtpd.key: senha
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BR
State or Province Name (full name) [Some-State]:Parana
Locality Name (eg, city) []:Curitiba
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Douglas
Organizational Unit Name (eg, section) []:IT
Common Name (eg, YOUR name) []:mail.douglasqsantos.com.br
Email Address []:douglas.q.santos@douglasqsantos.com.br

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Douglas

Vamos assinar agora o nosso certificado

openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
Signature ok
subject=/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=IT/CN=mail.douglasqsantos.com.br/emailAddress=douglas.q.santos@douglasqsantos.com.br
Getting Private key
Enter pass phrase for smtpd.key:

Agora vamos tirar a senha do certificado agora

openssl rsa -in smtpd.key -out smtpd.key.unencrypted
Enter pass phrase for smtpd.key: senha
writing RSA key

Gerando o CA

mv -f smtpd.key.unencrypted smtpd.key
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650
Generating a 1024 bit RSA private key
.++++++
......++++++
writing new private key to 'cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BR
State or Province Name (full name) [Some-State]:Parana
Locality Name (eg, city) []:Curitiba
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Douglas
Organizational Unit Name (eg, section) []:IT
Common Name (eg, YOUR name) []:mail.douglasqsantos.com.br
Email Address []:douglas.q.santos@douglasqsantos.com.br

Ultimas chaves de Diffie Hellman

openssl dhparam 1024 -out dh_1024.pem
openssl dhparam 512 -out dh_512.pem

Configuração da conexão do MySQL + Postfix

Vamos configurar o arquivo que tem o controle do tipo de transporte se vai ser virtual ou vacation por exemplo

vim /etc/postfix/mysql_transport_maps.cf
user = mail
password = 123
hosts = localhost
dbname = mail
table = domain
select_field = transport
where_field = domain

Aqui vamos configurar o arquivo que controla as contas de email

vim /etc/postfix/mysql_virtual_alias_maps.cf 
user = mail
password = 123
hosts = localhost
dbname = mail
table = alias
select_field = goto
where_field = address

Aqui vamos configurar o arquivo que controla os domínios do postfix

vim /etc/postfix/mysql_virtual_domains_maps.cf 
user = mail
password = 123
hosts = localhost
dbname = mail
table = domain
select_field = domain
where_field = domain

Aqui vamos acertar o arquivo que controla as cotas do usuários e domínios

vim /etc/postfix/mysql_virtual_mailbox_limit_maps.cf 
user = mail
password = 123
hosts = localhost
dbname = mail
table = mailbox
select_field = quota
where_field = username

Aqui vamos acertar o arquivo que controla as mailbox

vim /etc/postfix/mysql_virtual_mailbox_maps.cf 
user = mail
password = 123
hosts = localhost
dbname = mail
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1

Vamos acertar as permissões

chmod o= /etc/postfix/mysql_*
chgrp postfix /etc/postfix/mysql_*

Vamos fazer o acerto dos aliases agora

mv /etc/aliases /etc/postfix

Ajustando arquivos de aliases para os redirecionamentos

vim /etc/postfix/aliases
[...]
root: douglas.q.santos@douglasqsantos.com.br

Agora vamos gerar a nova base de dados dos aliases

newaliases

Vamos fazer backup do arquivo de configuração

cp /etc/postfix/master.cf{,.bkp}

Ajustando arquivo de serviços do postfix

vim /etc/postfix/master.cf
#-------------------------SERVICES--------------------------------------------
#-----------------------------------------------------------------------------
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
#-----------------------------------------------------------------------------
smtp      inet  n       -       -       -       -       smtpd
submission inet n       -       -       -       -       smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
#smtps     inet  n       -       -       -       -       smtpd
  -o smtpd_sasl_auth_enable=yes
pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
        -o smtp_fallback_relay=
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache
#----------------------------END SERVICES-----------------------------------------
#----------------------------DELIVERY METHODS-------------------------------------
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix  -       n       n       -       2       pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}
#--------------------------END DELIVERY METHODS----------------------------------------------- 
#----------------------------VACATION---------------------------------------------------------
vacation    unix  -       n       n       -       -       pipe
  flags=Rq user=vacation argv=/var/spool/vacation/vacation.pl -f ${sender} -- ${recipient}
#----------------------------END VACATION-----------------------------------------------------

Configuração do controle de autenticação do Postfix

Agora vamos configurar o sasl

vim /usr/lib/sasl2/smtpd.conf
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
auxprop_plugin: sql
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: mail
sql_passwd: 123
sql_database: mail
sql_select: select password from mailbox where username = '%u@%r'
allowanonymouslogin: no
allowplaintext: yes
#Para efetuar debug de problemas analisar o arquivo /var/log/auth.log
#sql_verbose: yes
#log_level: 9

Vamos acertar a localização do arquivo com um link

ln -sf /usr/lib/sasl2/smtpd.conf /etc/postfix/sasl/smtpd.conf

Vamos colocar o sasl no grupo do postfix

usermod -G sasl postfix

Agora vamos acertar o sasauthd mais primeiro vamos fazer o backup do arquivo

cp /etc/default/saslauthd{,.bkp}

Agora vamos acertar a configuração do arquivo saslauthd

vim /etc/default/saslauthd
START=yes
DESC="SASL Authentication Daemon"
NAME="saslauthd"
MECHANISMS="pam"
MECH_OPTIONS=""
THREADS=5
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

Vamos acertar os arquivos do saslauthd para o postfix

mkdir -p /var/spool/postfix/var/run/saslauthd
chown postfix /var/spool/postfix/var/run/saslauthd/
cd /var/run
mv saslauthd saslauthd.bkp
ln -sf /var/spool/postfix/var/run/saslauthd

Agora vamos preparar o mysql para trabalhar com o Postfix

mkdir -p /var/spool/postfix/var/run/mysqld

Agora vamos acertar o arquivo de inicialização do MySQL

vim /etc/init.d/mysql
[...]
        fi
#insira a linha abaixo antes do ;; por quando o mysql for iniciar ele cria o socket e o link
/bin/ln -sf /var/run/mysqld/mysqld.sock /var/spool/postfix/var/run/mysqld/mysqld.sock
        ;;
 
  'stop')

Agora vamos acertar a permissão do diretório /var/run/mysqld

chown -R vmail:mysql /var/run/mysqld && chmod -R 775 /var/run/mysqld

Agora vamos reiniciar os serviços

/etc/init.d/mysql restart
/etc/init.d/saslauthd restart

Galera aqui vou demostrar a instalação do Courier e do Dovecot na minha opinião o Dovecot é um pouco mais chato, e o Courier mais simples de manipular.

Instalação do e configuração do Courier

aptitude install courier-imap courier-imap-ssl courier-pop courier-pop-ssl courier-authlib-mysql courier-authdaemon libgamin-dev -y
#Resposta
1) No
2) Ok

Agora vamos fazer backup dos arquivos de configuração do courier

cp /etc/courier/authdaemonrc{,.bkp}
cp /etc/courier/authmysqlrc{,.bkp}

Agora vamos acertar o arquivo de conexão do Courier com o Mysql

vim /etc/courier/authmysqlrc
MYSQL_SERVER localhost
MYSQL_USERNAME mail
MYSQL_PASSWORD 123
MYSQL_SOCKET /var/run/mysqld/mysqld.sock
MYSQL_PORT 3306
MYSQL_OPT 0
MYSQL_DATABASE mail
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD '107'
MYSQL_GID_FIELD '107'
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD '/home/vmail'
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD CONCAT("/home/vmail/",maildir)
MYSQL_QUOTA_FIELD concat(quota,'S')

Agora vamos acertar a configuração do serviço do Courier

vim /etc/courier/authdaemonrc
authmodulelist="authmysql"
authmodulelistorig="authmysql"
daemons=5
authdaemonvar=/var/run/courier/authdaemon
subsystem=mail
DEFAULTOPTIONS=""
LOGGEROPTS=""

Agora vamos acertar a configuração dos arquivos que vão gerar os nosso certificados para ssl. Primeiro vamos editar o arquivo do imap

vim /etc/courier/imapd.cnf

RANDFILE = /usr/lib/courier/imapd.rand

[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no

[ req_dn ]
C=BR
ST=PR
L=Curitiba
O=Douglas Imap Server
OU=Douglas IMAP SSL key
CN=mail.douglasqsantos.com.br
emailAddress=postmaster@douglasqsantos.com.br


[ cert_type ]
nsCertType = server

Agora vamos editar o arquivo do pop

vim /etc/courier/pop3d.cnf
RANDFILE = /usr/lib/courier/pop3d.rand

[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no

[ req_dn ]
C=BR
ST=PR
L=Curitiba
O=Douglas Pop Server
OU=Douglas POP3 SSL key
CN=mail.douglasqsantos.com.br
emailAddress=postmaster@douglasqsantos.com.br


[ cert_type ]
nsCertType = server

Agora vamos fazer backup dos certificados antigos.

mv /etc/courier/pop3d.pem /etc/courier/pop3d.pem.bkp
mv /etc/courier/imapd.pem /etc/courier/imapd.pem.bkp
unlink /usr/lib/courier/pop3d.pem
unlink /usr/lib/courier/imapd.pem

Agora vamos gerar o novo certificado para o Imap-ssl

mkimapdcert

Agora vamos gerar o novo certificado para o Pop-ssl

mkpop3dcert

Agora vamos acertar os links dos certificados do courier

ln -sf /usr/lib/courier/imapd.pem /etc/courier/imapd.pem
ln -sf /usr/lib/courier/pop3d.pem /etc/courier/pop3d.pem

Agora é só reiniciar os serviços

/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imap restart
/etc/init.d/courier-imap-ssl restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-pop-ssl restart

Ajustando a forma de autenticação do POP3, IMAP e SMTP

vim /etc/pam.d/pop3
auth required pam_mysql.so user=mail passwd=123 host=localhost db=mail table=mailbox usercolumn=username passwdcolumn=password crypt=1 sqllog=0 debug
account sufficient pam_mysql.so user=mail passwd=123 host=localhost db=mail table=mailbox usercolumn=username passwdcolumn=password crypt=1 sqllog=0 debug
auth sufficient pam_unix.so debug
account sufficient pam_unix.so debug

Agora vamos copiar os arquivos da pam

cp -Rfa /etc/pam.d/pop3 /etc/pam.d/imap
cp -Rfa /etc/pam.d/pop3 /etc/pam.d/smtp

Agora vamos fazer alguns ajustes na configuração do MySQL.

vim /etc/mysql/my.cnf
[...]
key_buffer              = 32M
max_allowed_packet      = 32M
[...]
query_cache_limit       = 4M
query_cache_size        = 32M
[...]

Restartando os serviços:

/etc/init.d/mysql restart
/etc/init.d/postfix restart
/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imap restart
/etc/init.d/courier-imap-ssl restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-pop-ssl restart

Verificando se os serviços estão sendo executados:

nmap -sS -T4 localhost

Starting Nmap 6.00 ( http://nmap.org ) at 2013-11-15 15:08 BRST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000031s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 990 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
25/tcp   open  smtp
80/tcp   open  http
110/tcp  open  pop3
111/tcp  open  rpcbind
143/tcp  open  imap
587/tcp  open  submission
993/tcp  open  imaps
995/tcp  open  pop3s
3306/tcp open  mysql

Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds

Agora já podemos testar o nosso servidor de email Acesse o postfixadmin

  • Em Virtual/Criar conta de email
  • Informe o nome da conta ex: douglas.q.santos
  • Selecione o domínio ex: douglasqsantos.com.br
  • Informe uma senha e confirme ela
  • Informe um nome para a conta de email
  • Agora selecione Criar conta de email

Agora nos logs do servidor de email vamos ter algo como abaixo

tail -f /var/log/mail.log
Nov 15 15:14:17 mail postfix/smtpd[12807]: connect from localhost[::1]
Nov 15 15:14:17 mail postfix/smtpd[12807]: D730317443: client=localhost[::1]
Nov 15 15:14:17 mail postfix/cleanup[12812]: D730317443: message-id=<20131115171417.D730317443@mail.douglasqsantos.com.br>
Nov 15 15:14:17 mail postfix/qmgr[12789]: D730317443: from=<douglas.q.santos@douglasqsantos.com.br>, size=488, nrcpt=1 (queue active)
Nov 15 15:14:17 mail postfix/smtpd[12807]: disconnect from localhost[::1]
Nov 15 15:14:17 mail postfix/virtual[12813]: D730317443: to=<douglas.q.santos@douglasqsantos.com.br>, relay=virtual, delay=0.12, delays=0.04/0.04/0/0.04, dsn=2.0.0, status=sent (delivered to maildir)
Nov 15 15:14:17 mail postfix/qmgr[12789]: D730317443: removed

Agora vamos testar a autenticação do Cliente.

testsaslauthd -u douglas.q.santos@douglasqsantos.com.br -p doug123
0: OK "Success."

Vamos fazer um teste para verificar se o smtp esta funcionando

telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.douglasqsantos.com.br ESMTP
ehlo mail.douglasqsantos.com.br
250-mail.douglasqsantos.com.br
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
starttls
220 2.0.0 Ready to start TLS
quit
quit
Connection closed by foreign host.

Agora vamos fazer um teste de envio de email utilizando smtp + tls

Vamos criar um script para gerar o nosso usuário e senha em base64

vim /srv/base64
#!/usr/bin/perl -w
use strict;
use MIME::Base64;
print "Pressione Enter para sair. \n";
print "Insira a string: ";
my $line;
while( $line = <STDIN> )
{
  if( $line ne "\n" ){
    chomp($line) ;
    print "Base64 encode é : " . encode_base64($line) ;
    print "Insira a string: ";
  }
  else
  {
    exit;
  }
}

Agora precisamos dar a permissão para o nosso script

chmod +x /srv/base64

Vamos gerar o usuário e a senha em base64 que o postfix utiliza para validar o usuário e senha

/srv/base64 
Pressione Enter para sair. 
Insira a string: douglas.q.santos@douglasqsantos.com.br
Base64 encode é : ZG91Z2xhc0Bkb3VnbGFzLmxhbg==
Insira a string: doug123
Base64 encode é : ZG91ZzEyMw==
Insira a string: 
openssl s_client -starttls smtp -crlf -connect localhost:25 -quiet
depth=0 /C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=TI/CN=mail.douglasqsantos.com.br/emailAddress=douglas.q.santos@douglasqsantos.com.br
verify error:num=18:self signed certificate
verify return:1
depth=0 /C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=TI/CN=mail.douglasqsantos.com.br/emailAddress=douglas.q.santos@douglasqsantos.com.br
verify return:1
250 DSN
EHLO mail.douglasqsantos.com.br
250-mail.douglasqsantos.com.br
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth login
334 VXNlcm5hbWU6
#A Linha abaixo é o codigo base64 que foi gerado para o usuário douglas.q.santos@douglasqsantos.com.br
ZG91Z2xhc0Bkb3VnbGFzLmxhbg==
334 UGFzc3dvcmQ6
#A linha abaixo é o codigo base64 que foi gerado para a senha doug123
ZG91ZzEyMw==
235 2.7.0 Authentication successful
mail from: <douglas.q.santos@douglasqsantos.com.br>
250 2.1.0 Ok
rcpt to: <douglas.q.santos@douglasqsantos.com.br>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
From: Douglas <douglas.q.santos@douglasqsantos.com.br>
To: Douglas <douglas.q.santos@douglasqsantos.com.br>
Subject: Teste de tls
Teste de Envio de email utilizando TLS
.
250 2.0.0 Ok: queued as 5C72411F4E
quit
221 2.0.0 Bye

Para somente visualizarmos o certificado do smtp podemos fazer da seguinte maneira

openssl s_client -starttls smtp -crlf -connect localhost:25 -showcerts
CONNECTED(00000003)
depth=0 C = BR, ST = Parana, L = Curitiba, O = Douglas, OU = IT, CN = mail.douglasqsantos.com.br, emailAddress = douglas.q.santos@douglasqsantos.com.br
verify error:num=18:self signed certificate
verify return:1
depth=0 C = BR, ST = Parana, L = Curitiba, O = Douglas, OU = IT, CN = mail.douglasqsantos.com.br, emailAddress = douglas.q.santos@douglasqsantos.com.br
verify return:1
---
Certificate chain
 0 s:/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=IT/CN=mail.douglasqsantos.com.br/emailAddress=douglas.q.santos@douglasqsantos.com.br
   i:/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=IT/CN=mail.douglasqsantos.com.br/emailAddress=douglas.q.santos@douglasqsantos.com.br
-----BEGIN CERTIFICATE-----
MIIClzCCAgACCQCi9HiCKiuCjzANBgkqhkiG9w0BAQUFADCBjzELMAkGA1UEBhMC
QlIxDzANBgNVBAgMBlBhcmFuYTERMA8GA1UEBwwIQ3VyaXRpYmExEDAOBgNVBAoM
B0RvdWdsYXMxCzAJBgNVBAsMAklUMRkwFwYDVQQDDBBtYWlsLmRvdWdsYXMubGFu
MSIwIAYJKoZIhvcNAQkBFhNkb3VnbGFzQGRvdWdsYXMubGFuMB4XDTEzMTExNTE2
NTk0NFoXDTIzMTExMzE2NTk0NFowgY8xCzAJBgNVBAYTAkJSMQ8wDQYDVQQIDAZQ
YXJhbmExETAPBgNVBAcMCEN1cml0aWJhMRAwDgYDVQQKDAdEb3VnbGFzMQswCQYD
VQQLDAJJVDEZMBcGA1UEAwwQbWFpbC5kb3VnbGFzLmxhbjEiMCAGCSqGSIb3DQEJ
ARYTZG91Z2xhc0Bkb3VnbGFzLmxhbjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
gYEAwTZ8ugoGDl1aPMQ3xxD5mjplJmfU65Sm44yNbkNssqjqjAVYEQ1vhWus8jOl
7k9shupEkw+RdxED1Cn0AkddRkN9Ncen/aaUL5dHMq6QuXleNU2KrTWI0Kb+rfnq
USoyCntfs1lcsDVYdwuFWsFmsHtuhANgQJIW25dlA7pd/VsCAwEAATANBgkqhkiG
9w0BAQUFAAOBgQCIIG5gY63zSnrRzNQCJm5OkUdq/fa+Q3a5QKqnX28J5hBkYkZb
AV3rVAoXyhldwduLi2DIIKMwOpjTUJ0lnifxq4Bo3+4iKz/heMKt2bTrZRg1TKLD
5VCi/k88nuMPhfvzWCoFm83+mBRy8O73AYnmdv7IwPMMHkKTp+oAPO66jw==
-----END CERTIFICATE-----
---
Server certificate
subject=/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=IT/CN=mail.douglasqsantos.com.br/emailAddress=douglas.q.santos@douglasqsantos.com.br
issuer=/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=IT/CN=mail.douglasqsantos.com.br/emailAddress=douglas.q.santos@douglasqsantos.com.br
---
Acceptable client certificate CA names
/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=IT/CN=mail.douglasqsantos.com.br/emailAddress=douglas.q.santos@douglasqsantos.com.br
---
SSL handshake has read 1656 bytes and written 502 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: zlib compression
Expansion: zlib compression
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 3E99954060BA522690224B7BA574F12DA08D9FE489C9F3E9F2F560963847B830
    Session-ID-ctx: 
    Master-Key: 4C890F162CF0F19BDE4A2208264B880E2C62F5E45A0E4ADBB07B34CC68D5D610572C082128E368F663FE70BF33683B87
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 3600 (seconds)
    TLS session ticket:
    0000 - 2e f5 61 81 cd bf 72 4e-db 7b ff b1 40 53 7f bc   ..a...rN.{..@S..
    0010 - f3 1a e2 6a d0 65 45 78-21 29 56 d0 62 8a 34 6a   ...j.eEx!)V.b.4j
    0020 - 30 47 65 3a f9 be 3b 5a-73 c3 b7 68 5b f1 d5 ad   0Ge:..;Zs..h[...
    0030 - 0f 41 96 33 e7 f9 73 25-6a 3f 85 00 4e f0 ec 35   .A.3..s%j?..N..5
    0040 - bb 2f cc 70 fe f3 1e e1-99 7d e7 a0 69 29 a3 83   ./.p.....}..i)..
    0050 - 2d 17 61 78 69 a2 2b 35-6e 7e 85 c4 c0 92 02 86   -.axi.+5n~......
    0060 - ac f8 ed dc 63 f0 f5 f4-a3 a9 1d 4a d5 95 ff df   ....c......J....
    0070 - ad 66 11 6b 36 49 00 2a-0c f6 0c e4 69 d7 a9 c3   .f.k6I.*....i...
    0080 - f1 46 33 89 0c d9 7c 79-67 89 dd 79 5d de 5b 2f   .F3...|yg..y].[/
    0090 - 72 b8 7a 2b 5e 76 3a 3b-37 48 7a 1e 8e be 78 f2   r.z+^v:;7Hz...x.
    00a0 - ae 94 75 e9 b3 86 0d 3b-40 ad a6 09 42 6f 77 c8   ..u....;@...Bow.

    Compression: 1 (zlib compression)
    Start Time: 1384536023
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
250 DSN
quit
221 2.0.0 Bye
closed

Vamos fazer um teste de acesso pop

telnet localhost 110
Trying ::1...
Connected to localhost.
Escape character is '^]'.
+OK Hello there.
user douglas.q.santos@douglasqsantos.com.br
+OK Password required.
pass doug123
+OK logged in.
list
+OK POP3 clients that break here, they violate STD53.
1 595
.
retr 1
+OK 595 octets follow.
Return-Path: <douglas.q.santos@douglasqsantos.com.br>
X-Original-To: douglas.q.santos@douglasqsantos.com.br
Delivered-To: douglas.q.santos@douglasqsantos.com.br
Received: from 192.168.1.70 (localhost [IPv6:::1])
  by mail.douglasqsantos.com.br (Postfix) with ESMTP id D730317443
  for <douglas.q.santos@douglasqsantos.com.br>; Fri, 15 Nov 2013 15:14:17 -0200 (BRST)
To: douglas.q.santos@douglasqsantos.com.br
From: douglas.q.santos@douglasqsantos.com.br
Subject: Bem-vindo(a)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Message-Id: <20131115171417.D730317443@mail.douglasqsantos.com.br>
Date: Fri, 15 Nov 2013 15:14:17 -0200 (BRST)

Hi,

Welcome to your new account.
.
quit
+OK Bye-bye.
Connection closed by foreign host.

Agora vamos efetuar um teste de pop com ssl

openssl s_client -connect localhost:995 -quiet
depth=0 C = BR, ST = PR, L = Curitiba, O = Douglas Pop Server, OU = Douglas POP3 SSL key, CN = mail.douglasqsantos.com.br, emailAddress = postmaster@douglas.q.santos
verify error:num=18:self signed certificate
verify return:1
depth=0 C = BR, ST = PR, L = Curitiba, O = Douglas Pop Server, OU = Douglas POP3 SSL key, CN = mail.douglasqsantos.com.br, emailAddress = postmaster@douglas.q.santos
verify return:1
+OK Hello there.
user douglas.q.santos@douglasqsantos.com.br
+OK Password required.
pass doug123
+OK logged in.
list
+OK POP3 clients that break here, they violate STD53.
1 595
.
retr 1
+OK 595 octets follow.
Return-Path: <douglas.q.santos@douglasqsantos.com.br>
X-Original-To: douglas.q.santos@douglasqsantos.com.br
Delivered-To: douglas.q.santos@douglasqsantos.com.br
Received: from 192.168.1.70 (localhost [IPv6:::1])
  by mail.douglasqsantos.com.br (Postfix) with ESMTP id D730317443
  for <douglas.q.santos@douglasqsantos.com.br>; Fri, 15 Nov 2013 15:14:17 -0200 (BRST)
To: douglas.q.santos@douglasqsantos.com.br
From: douglas.q.santos@douglasqsantos.com.br
Subject: Bem-vindo(a)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Message-Id: <20131115171417.D730317443@mail.douglasqsantos.com.br>
Date: Fri, 15 Nov 2013 15:14:17 -0200 (BRST)

Hi,

Welcome to your new account.
.
quit
+OK Bye-bye.

Agora vamos efetuar um teste com o Imap

telnet localhost 143
Trying ::1...
Connected to localhost.
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-2011 Double Precision, Inc.  See COPYING for distribution information.
a login douglas.q.santos@douglasqsantos.com.br doug123
a OK LOGIN Ok.
a list "" "*"
* LIST (\Unmarked \HasNoChildren) "." "INBOX"
a OK LIST completed
a examine inbox
* FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent)
* OK [PERMANENTFLAGS ()] No permanent flags permitted
* 1 EXISTS
* 1 RECENT
* OK [UIDVALIDITY 384536156] Ok
* OK [MYRIGHTS "acdilrsw"] ACL
a OK [READ-ONLY] Ok
a fetch 1 body[]
* 1 FETCH (BODY[] {595}
Return-Path: <douglas.q.santos@douglasqsantos.com.br>
X-Original-To: douglas.q.santos@douglasqsantos.com.br
Delivered-To: douglas.q.santos@douglasqsantos.com.br
Received: from 192.168.1.70 (localhost [IPv6:::1])
  by mail.douglasqsantos.com.br (Postfix) with ESMTP id D730317443
  for <douglas.q.santos@douglasqsantos.com.br>; Fri, 15 Nov 2013 15:14:17 -0200 (BRST)
To: douglas.q.santos@douglasqsantos.com.br
From: douglas.q.santos@douglasqsantos.com.br
Subject: Bem-vindo(a)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Message-Id: <20131115171417.D730317443@mail.douglasqsantos.com.br>
Date: Fri, 15 Nov 2013 15:14:17 -0200 (BRST)

Hi,

Welcome to your new account.
)
a OK FETCH completed.
a logout
* BYE Courier-IMAP server shutting down
a OK LOGOUT completed
Connection closed by foreign host.

Agora vamos efetuar um teste do imap com ssl

openssl s_client -connect localhost:993 -quiet
depth=0 C = BR, ST = PR, L = Curitiba, O = Douglas Imap Server, OU = Douglas IMAP SSL key, CN = mail.douglasqsantos.com.br, emailAddress = postmaster@douglas.q.santos
verify error:num=18:self signed certificate
verify return:1
depth=0 C = BR, ST = PR, L = Curitiba, O = Douglas Imap Server, OU = Douglas IMAP SSL key, CN = mail.douglasqsantos.com.br, emailAddress = postmaster@douglas.q.santos
verify return:1
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE AUTH=PLAIN ACL ACL2=UNION] Courier-IMAP ready. Copyright 1998-2011 Double Precision, Inc.  See COPYING for distribution information.
a login douglas.q.santos@douglasqsantos.com.br doug123
a OK LOGIN Ok.
a list "" "*"
* LIST (\Unmarked \HasNoChildren) "." "INBOX"
a OK LIST completed
a examine inbox
* FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent)
* OK [PERMANENTFLAGS ()] No permanent flags permitted
* 1 EXISTS
* 1 RECENT
* OK [UIDVALIDITY 384536218] Ok
* OK [MYRIGHTS "acdilrsw"] ACL
a OK [READ-ONLY] Ok
a fetch 1 body[]
* 1 FETCH (BODY[] {595}
Return-Path: <douglas.q.santos@douglasqsantos.com.br>
X-Original-To: douglas.q.santos@douglasqsantos.com.br
Delivered-To: douglas.q.santos@douglasqsantos.com.br
Received: from 192.168.1.70 (localhost [IPv6:::1])
  by mail.douglasqsantos.com.br (Postfix) with ESMTP id D730317443
  for <douglas.q.santos@douglasqsantos.com.br>; Fri, 15 Nov 2013 15:14:17 -0200 (BRST)
To: douglas.q.santos@douglasqsantos.com.br
From: douglas.q.santos@douglasqsantos.com.br
Subject: Bem-vindo(a)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Message-Id: <20131115171417.D730317443@mail.douglasqsantos.com.br>
Date: Fri, 15 Nov 2013 15:14:17 -0200 (BRST)

Hi,

Welcome to your new account.
)
a OK FETCH completed.
a logout
* BYE Courier-IMAP server shutting down
a OK LOGOUT completed

Até aqui já temos o Postfix trabalhando corretamente porém vamos adicionar mais funcionalidades a ele ;)

Migrando as contas do Servidor Atual para o Novo Servidor com o ImapSync

Vamos obter o imapsync

cd /usr/src
git clone https://github.com/imapsync/imapsync.git

Vamos instalar as dependências do ImapSync

aptitude install  libmail-imapclient-perl libdigest-md5-file-perl libterm-readkey-perl libio-socket-ssl-perl libfile-spec-perl libdigest-hmac-perl makepasswd -y

Agora vamos acessar o diretório do imapsync

cd /usr/src/imapsync

Agora precisamos criar um diretório de controle interno dele

mkdir dist

Agora vamos compilar ele

make

Agora vamos mandar instalar ele

make install clean

Agora vamos pegar por exemplo a conta do nerso para sincronizar

Vamos criar um arquivo contendo o usuário e senha do servidor de email atual e o usuário e senha do servidor novo, nós podemos ter um usuário por linha

vim /usr/src/users
nerso@douglas.q.santos;senha1;nerso@douglas.q.santos;senha2

O arquivo deve ser no seguinte formato:

usuário1;senha1;usuário2;senha2

Onde:

  • usuário1: é o usuário do servidor atual que está no uol
  • senha1: é a senha do usuário atual que está no uol
  • usuário2: é o usuário do servidor novo que acabamos de montar
  • senha2: é a senha do usuário do servidor novo que acabamos de montar

Nós vamos fazer o sincronismo de todas as contas que estiverem no arquivo /tmp/users

Agora vamos ao script de sincronismo

vim /usr/src/sincroniza.sh
#!/bin/bash
#-------------------------------------------------------------------------
# sincroniza.sh
#
# Site  : http://wiki.douglasqsantos.com.br
# Autor : Douglas Q. dos Santos <douglas.q.santos@douglasqsantos.com.br>
# Manutenção: Douglas Q. dos Santos <douglas.q.santos@douglasqsantos.com.br>
#
#-------------------------------------------------------------------------
# Efetua o sincronismo das caixas de mensagens entre servidor de email
#-------------------------------------------------------------------------
# Histórico:
#
# Versão 1:
# Data: 22/02/2011
# Descrição: Efetua o sincronismo das caizas de mensagens entre servidores
# de email utilizando o imapsync no Debian Squeeze
#
#--------------------------------------------------------------------------
#Licença: http://creativecommons.org/licenses/by-sa/3.0/legalcode
#
#--------------------------------------------------------------------------

#VARIAVEIS GLOBAIS UTILIZADAS NO SCIRPT
RED="\033[01;31m"
GREEN="\033[01;32m"
WHITE="\033[01;37m"
CLOSE="\033[m"
IMAPSYNC=$(which imapsync)
SERVER1="mail.douglasqsantos.com.br"
SERVER2="localhost"
LISTA="/usr/src/users"
LOGS="/var/log/sincroniza.log"


#FUNÇÃO PARA SINCRONIZAR AS MENSAGENS
_Sincronizar()
{
for END in $(cat ${LISTA}); 
do
#O ARQUIVO DEVE ESTAR SEPARADO POR ; 
USER1=$(echo ${END} | cut -d ';' -f 1)
SENHA1=$(echo ${END} | cut -d ';' -f 2)
USER2=$(echo ${END} | cut -d ';' -f 3)
SENHA2=$(echo ${END} | cut -d ';' -f 4)
echo -e "${GREEN}SINCRONIZANDO A CONTA DE EMAIL ${RED}${USER1}${CLOSE} ${GREEN}DO SERVIDOR${CLOSE} ${RED}${SERVER1}${CLOSE} ${GREEN}PARA O SERVIDOR${CLOSE} ${RED}${SERVER2}${CLOSE} ${CLOSE}"
sleep 2
${IMAPSYNC} --host1 ${SERVER1} --user1 ${USER1} --password1 ${SENHA1} --host2 localhost --user2 ${USER2} --password2 ${SENHA2}
_Validar ${USER1}
done
}

#FUNÇÃO PARA VALIDAR SE A CONTA CONSEGUIU SER SINCRONIZADA
_Validar()
{
if [ $? -eq 0 ]; then
  echo -e "${GREEN}CONTA DE EMAIL ${RED}${1}${CLOSE} ${GREEN}SINCRONIZADA COM SUCESSO ${CLOSE}" 
else
      echo -e "${RED}FALHA AO SINCRONIZAR A CONTA DE EMAIL ${WHITE}${1}${CLOSE}${CLOSE}"
  #GERANDO LOGS DAS CONTAS QUE DERAO PROBLEMAS PARA SINCRONIZAR
      echo -e "FALHA AO SINCRONIZAR A CONTA DE EMAIL ${1} NA DATA: $(date)" >> ${LOGS}
fi

}

_Sincronizar

Agora precisamos dar permissão para o nosso script

chmod +x /usr/src/sincroniza.sh

Agora é só mandar executar ele

/usr/src/sincroniza.sh

Quando acabar o sincronismo vamos ter algo como abaixo

Host2 Nb messages:             494 messages
Host2 Total size:        117416141 bytes (111.98 MiB)
Host2 Biggest message:     7830835 bytes (7.47 MiB)
Host2 Time spent:              0.7 seconds
++++ Statistics
Transfer started on               : Sun Jan 13 16:39:00 2013
Transfer ended on                 : Sun Jan 13 16:39:13 2013
Transfer time                     : 13.0 sec
Messages transferred              : 0 
Messages skipped                  : 496
Messages found duplicate on host1 : 12
Messages found duplicate on host2 : 0
Messages void (noheader) on host1 : 0
Messages void (noheader) on host2 : 0
Messages deleted on host1         : 0
Messages deleted on host2         : 0
Total bytes transferred           : 0 (0.00 KiB)
Total bytes duplicate host1       : 383100 (374.12 KiB)
Total bytes duplicate host2       : 0 (0.00 KiB)
Total bytes skipped               : 117384026 (111.95 MiB)
Total bytes error                 : 0 (0.00 KiB)
Message rate                      : 0.0 messages/s
Average bandwidth rate            : 0.0 KiB/s
Reconnections to host1            : 0
Reconnections to host2            : 0
Memory consumption                : 82.4 MiB
Biggest message                   : 0 bytes
Initial difference host2 - host1  : -2 messages, -350985 bytes (-342.76 KiB)
Final   difference host2 - host1  : -2 messages, -350985 bytes (-342.76 KiB)
Detected 0 errors

This current imapsync is up to date
Homepage: http://imapsync.lamiral.info/
CONTA DE EMAIL nerso@douglas.q.santos SINCRONIZADA COM SUCESSO 

Caso alguma conta de problemas para sincronizar vamos ter o arquivo de log em /var/log/sincroniza.log

Instalação e configuração do AfterLogicWebmail

Vamos obter ele e desempacotar

mkdir /var/www/webmail
cd /var/www/webmail
wget -c http://wiki.douglasqsantos.com.br/Downloads/mail/afterlogicwebmail.zip
unzip afterlogicwebmail.zip
rm -rf changelog.txt readme.txt afterlogicwebmail.zip
mv webmail/* .
rm -rf webmail

Agora vamos acertar as permissões do nosso webmail.

cd /var/www/webmail
find . -type f -exec chmod 644 {} \;
find . -type d -exec chmod 755 {} \;
chown -R www-data:www-data /var/www/webmail

Agora vamos preparar o banco de dados para o webmail

mysql -u root -p
CREATE DATABASE webmail;
GRANT ALL PRIVILEGES ON webmail.* TO webmail@localhost IDENTIFIED BY 'senha';
flush privileges;
quit;

Agora vamos acessar pelo navegador a tela de configuração do webmail http://ip_servidor/webmail/install/

  1. Nesta página inicial de instalação os requisitos devem estar todos em Verde, no final da página selecione Next.
  2. Agora leia o termo de licença e selecione I Agree para continuar.
  3. Agora aqui nesta tela temos que informar:
    1. SQL login: webmail
    2. SQL password: senha
    3. Database name: webmail
    4. Host: localhost
  4. Agora selecione Test database, o resultado deve ser Connected successfully se os dados estiverem corretos.
  5. Deixe selecionado Create Database Tables.
  6. Agora selecione Next.
  7. Agora precisamos informar a senha e confirmar para o nosso mailadm que vai poder gerenciar a configuração global do nosso webmail.
  8. Agora selecione Next.
  9. Agora vamos selecionar os protocolos que o nosso webmail vai utilizar, vou selecionar SMTP e IMAP4.
  10. Agora selecione Test connection, caso tenha sucesso vai aparecer: SMTP connection to port 25 successful, sending outgoing e-mail over SMTP should work, IMAP connection to port 143 successful, checking and downloading incoming e-mail over IMAP should work.
  11. Agora selecione Next.
  12. Agora nós fomos redirecionados para uma página sobre a conclusão da nossa instalação. Volte a instalação do nosso webmail.
  13. Agora selecione Exit

Agora precisamos excluir a pasta install do nosso webmail.

rm -rf /var/www/webmail/install/

Vamos acertar o arquivo /etc/php5/apache2/php.ini

vim /etc/php5/apache2/php.ini
[...]
memory_limit = 256M
[...]
suhosin.session.encrypt=0
[...]
date.timezone = America/Sao_Paulo

Agora precisamos reiniciar o apache

/etc/init.d/apache2 restart

Agora vamos acertar a configuração global do nosso webmail em http://ip_servidor/webmail/adminpanel/ informe o usuário mailadm e a senha que você definiu para ele.

  • Selecione a Parte seperior da tela Domains
  • Agora selecione Default domain settings
  • Agora do lado direito da tela temos a configuração geral do webmail
  • Em site name informe o nome para o seu Webmail
  • Agora em skin selecione o Skin padrão para os seus usuários.
  • Agora fica a sua escolha a opção allow users to access interface settings, que habilita o usuário a efetuar alterações na configuração do webmail.
  • Agora em Language selecione Portuguese-Brazil
  • Agora em Timezone selecione (GMT -03:00) Brasilia
  • Agora em time format selecione 13:00
  • Agora selecione Save no final da tela do lado direito.
  • Agora na guia Webmail vamos mudar Messages per page para 50.
  • Agora em Autocheck mail every selecione 1 minute.
  • Agora selecione Save
  • Selecione agora na parte superior da tela System.
  • Aqui temos a configuração do nosso banco de dados caso necessite efetuar alguma alteração.
  • Do lado esquerdo da tela temos o link Security aonde temos o nome do usuário que pode efetuar login no painel de controle e temos a opção de alterar a senha para ele.

O Webmail é bem simples de utilizar não vou entrar em detalhes, basta acessar http://ip_servidor/webmail e informar o usuário e senha que foi criado no postfixadmin.

Agora vamos criar um script para gerenciar os nossos serviços de Email o primeiro vamos levar em consideração que instalamos o Courier.

vim /etc/init.d/servmail.sh
#!/bin/bash
### CORES UTILIZADAS NO SCRIPT ###
GREY="\033[01;30m"
RED="\033[01;31m"
GREEN="\033[01;32m"
YELLOW="\033[01;33m"
BLUE="\033[01;34m"
PURPLE="\033[01;35m"
CYAN="\033[01;36m"
WHITE="\033[01;37m"
CLOSE="\033[m"

#VALIDA RETORNO DE COMANDO
_CHECAR () {
if [ $? -eq 0 ]; then
  echo -e "${GREEN}[  OK  ]${CLOSE}"
else
  echo -e " ${RED}[ FALHOU ]${CLOSE}"
fi
}


STOP="apache2 saslauthd courier-authdaemon courier-imap courier-imap-ssl courier-pop courier-pop-ssl postfix"
START="saslauthd courier-authdaemon courier-imap courier-imap-ssl courier-pop courier-pop-ssl postfix apache2"


case $1 in
stop)
echo -e "${RED} PARANDO OS SERVICOS ${CLOSE}"
for END in ${STOP}
do
/etc/init.d/${END} stop 
echo -e "${RED} SERVICO ${END} PARADO COM SUCESSO ${CLOSE} $(_CHECAR)";
done
echo -e "${RED} SERVICOS PARADOS ${CLOSE}"
;;

start)
echo -e "${BLUE} INICIANDO OS SERVICOS ${CLOSE}"
for END in ${START}
do
/etc/init.d/${END} start
echo -e "${BLUE} SERVICO ${END} INICIADO COM SUCESSO ${CLOSE} $(_CHECAR)";
done
echo -e "${BLUE} SERVICOS INICIADOS ${CLOSE}"
;;

restart)
  $0 stop
  $0 start
;;

  *)
   echo  "${RED}Opcoes Validas:(start|stop|restart)${CLOSE}"
  ;;

esac

Agora vamos acertar as permissões do script.

chmod 755 /etc/init.d/servmail.sh

Agora para parar os serviços de email.

/etc/init.d/servmail.sh stop

Agora para iniciar os serviços de email.

/etc/init.d/servmail.sh start

Agora para reiniciar os serviços de email.

/etc/init.d/servmail.sh restart

Agora é só ir ajustando de acordo com o seu ambiente.

Referências