Postfix + PostgreSQL + Courier + Roudcube Webmail + Postfixadmin + Quota + Debian Squeeze

Objetivo desse How To, precisamos instalar e configurar o Postfix trabalhando com a sua autenticação no PostgreSQL, 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 Roundcube Webmail.

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

Download do pacote do Postfix

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

aptitude update && aptitude dist-upgrade -y

Após a atualização do sistema é necessário a adição de repositórios do wheezy para termos a versão mais atual do postfix para podermos aplicar o patch para cotas.

vim /etc/apt/sources.list
[...]
#REPOSITORIO PARA O POSTFIX
deb ftp://ftp.pucpr.br/debian wheezy main contrib non-free
deb-src ftp://ftp.pucpr.br/debian wheezy main contrib non-free

Vamos atualizar os repositórios com os novos dados.

aptitude update -y

Agora vamos obter o código fonte do postfix e o patch para cotas

cd /usr/src
apt-get source postfix
wget -c http://wiki.douglasqsantos.com.br/Downloads/mail/postfix-vda-v11-2.9.1.patch

A última versão do patch para o postfix foi para a versão 2.9.1 do postfix porém funciona na 2.9.3 do postfix só precisamos fazer um ajuste e aplicar o patch Vamos alterar a versão do postfix no patch

sed -i 's/2.9.1/2.9.3/g' /usr/src/postfix-vda-v11-2.9.1.patch

Agora vamos aplicar o patch

cd /usr/src/postfix-2.9.3 && patch -p1 < /usr/src/postfix-vda-v11-2.9.1.patch
patching file README_FILES/VDA_README
patching file src/global/mail_params.h
patching file src/util/file_limit.c
patching file src/virtual/mailbox.c
patching file src/virtual/maildir.c
patching file src/virtual/virtual.c
patching file src/virtual/virtual.h

Agora vamos comentar as linhas do arquivo “/etc/apt/sources.list” adicionadas para o download do postfix.

vim /etc/apt/sources.list
[...]
#REPOSITORIO PARA O POSTFIX
#deb ftp://ftp.pucpr.br/debian wheezy main contrib non-free
#deb-src ftp://ftp.pucpr.br/debian wheezy main contrib non-free

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
aptitude install debhelper po-debconf libdb-dev ssl-cert libpcre3-dev libpg-perl libmysqlclient-dev libssl-dev libsasl2-dev libpq-dev libcdb-dev hardening-wrapper -y
aptitude install libldap2-dev libsqlite3-dev -y

Agora vamos criar os pacotes .deb

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

Aqui vamos ter que responder algumas perguntas na instalação dos pacotes.

  • Irá perguntar o tipo de configuração do Postfix, informe Site Internet
  • Irá perguntar o nome do domínio kque será utilizado, informe douglasqsantos.com.br

Agora vamos instalar os pacotes adicionais necessários.

dpkg -i postfix-pcre*.deb
dpkg -i postfix-pgsql*.deb
dpkg -i postfix-doc*.deb

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

aptitude install bsd-mailx

Agora vamos acertar alguns parâmetros do sistema Nome e ip do servidor

vim /etc/hosts
127.0.0.1       localhost
ip_servidor     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 para a utilização do Postfixadmin

aptitude update && aptitude dist-upgrade -y
aptitude install apache2 php5 php5-pgsql php5-imap libpam-pgsql -y

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

Agora vamos instalar o PostgreSQL

aptitude install postgresql postgresql-client postgresql-common postgresql-contrib postgresql-doc postgresql-server-dev-all -y

Aqui vamos configurar em qual endereço ip o servidor vai escutar vamos colocar * para ele escutar em todas as interfaces disponíveis, e vamos desativar o ssl.

vim /etc/postgresql/8.4/main/postgresql.conf
[...]
listen_address = '*'
[...]
ssl = false 
[...]

Agora precisamos liberar o acesso no PostgreSQL caso precisemos conectar nele de alguma máquina fora o servidor

vim /etc/postgresql/8.4/main/pg_hba.conf
[...]
#no final do arquivo adicione a seguinte linha
host    all         all         192.168.1.0/24             md5

Agora vamos mandar reiniciar o nosso PostgreSQL

/etc/init.d/postgresql restart

Agora vamos definir uma senha para o usuário postgres

su - postgres
psql
postgres=# ALTER USER postgres WITH PASSWORD 'senha';
ALTER ROLE
postgres=# \q
postgres@mail:~$ exit
logout

Agora vamos criar o usuário e o banco que vamos utilizar para o Postfix

psql -h localhost -U postgres
Senha para usuário postgres: #senha
psql (8.4.13)
Digite "help" para ajuda.
postgres=# create user mail with password '123';
CREATE ROLE
postgres=# create database mail with owner mail;
CREATE DATABASE
postgres=# \q

Instalação e configuração do PostFixAdmin

A versão 2.3.5 do postfixadmin ta com bug no envio de email para Alias, por isso estou utilizando a versão 2.3.3.

cd /var/www
rm -rf *
wget -c http://wiki.douglasqsantos.com.br/Downloads/mail/postfixadmin-2.3.3.tar.gz
tar -xzvf postfixadmin-2.3.3.tar.gz
mv postfixadmin-2.3.3 postfixadmin
rm -rf postfixadmin-2.3.3*
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\['database_type'\] = 'mysql';/\$CONF\['database_type'\] = 'pgsql';/" /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

vim /var/www/postfixadmin/config.inc.php
$CONF['transport_options'] = array (
    'virtual',   //for virtual accounts
    'local',     //for system accounts
    'vacation',  //for system accounts
    'relay'  //for backup mx
);

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.

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-perl liblog-log4perl-perl liblog-dispatch-perl -y
aptitude install libgetopt-argvfile-perl libmime-charset-perl libmime-encwords-perl  -y

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

vim /var/spool/vacation/vacation.pl
[...]
our $db_type = 'Pg'; 
#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, 10.0.0.0/24
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-------------------------------------------- 
#--------------------------------POSTGRESQL-------------------------------------- 
transport_maps                  = proxy:pgsql:/etc/postfix/pgsql_transport_maps.cf
virtual_alias_maps              = proxy:pgsql:/etc/postfix/pgsql_virtual_alias_maps.cf
virtual_mailbox_domains         = proxy:pgsql:/etc/postfix/pgsql_virtual_domains_maps.cf
virtual_mailbox_maps            = proxy:pgsql:/etc/postfix/pgsql_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 POSTGRESQL-------------------------------------- 
#-----------------------------QUOTA-----------------------------------------------
virtual_mailbox_limit           = 51200000
virtual_mailbox_limit           = 0
virtual_maildir_extended        = yes
virtual_mailbox_limit_override  = yes
virtual_mailbox_limit_maps      = pgsql:/etc/postfix/pgsql_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 dnsbl.njabl.org,
 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@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@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@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 PostgreSQL + Postfix

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

vim /etc/postfix/pgsql_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/pgsql_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/pgsql_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/pgsql_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/pgsql_virtual_mailbox_maps.cf 
user = mail
password = 123
hosts = localhost
dbname = mail
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 't'

Vamos acertar as permissões

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

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@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
allow_plaintext: truesql_verbose: yes
sql_engine: pgsql
sql_hostnames: localhost
sql_user: mail
sql_passwd: 123
sql_database: mail
sql_select: select password from mailbox where username = '%u'

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 acertar o acesso do PostgreSQL para a jaula do Postfix

Vamos parar o postgresql

/etc/init.d/postgresql stop

Agora vamos remover o diretório default que armazena o pid do postgresql

rm -rf /var/run/postgresql/

Agora vamos criar o diretório dentro da jaula do postfix e vamos criar um link para o sistema

cd /var/run
mkdir /var/spool/postfix/var/run/postgresql
ln -sf /var/spool/postfix/var/run/postgresql/
chown -R postfix:postgres postgresql
chown -R postfix:postgres /var/spool/postfix/var/run/postgresql
chmod 775 /var/spool/postfix/var/run/postgresql

Agora vamos reiniciar os serviços

/etc/init.d/postgresql restart
/etc/init.d/saslauthd restart

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

aptitude install courier-imap courier-imap-ssl courier-pop courier-pop-ssl courier-authlib-postgresql courier-authdaemon libgamin-dev -y
#Resposta1) No
2) Ok

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

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

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

vim /etc/courier/authpgsqlrc
PGSQL_HOST              127.0.0.1
PGSQL_PORT              5432
PGSQL_USERNAME          mail
PGSQL_PASSWORD          123
PGSQL_DATABASE          mail
PGSQL_USER_TABLE        mailbox
PGSQL_CRYPT_PWFIELD     password
PGSQL_UID_FIELD         '107'
PGSQL_GID_FIELD         '107'
PGSQL_LOGIN_FIELD       username
PGSQL_HOME_FIELD        '/home/vmail'
PGSQL_MAILDIR_FIELD     '/home/vmail/' || maildir
PGSQL_QUOTA_FIELD       quota || 'S'

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

vim /etc/courier/authdaemonrc
authmodulelist="authpgsql"
authmodulelistorig="authpgsql"
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

Vamos ajustar o pam_pgsql.conf ele não existe por padrão no sistema então temos que criar ele

vim /etc/pam_pgsql.conf 
database = mail
host = localhost
user = mail
password = 123
table = mailbox
user_column = username
pwd_column = password
pw_type = crypt
debug

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

vim /etc/pam.d/pop3
auth        required    pam_pgsql.so
account     required    pam_pgsql.so
password    required    pam_pgsql.so

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

Restartando os serviços:

/etc/init.d/postgresql 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 5.00 ( http://nmap.org ) at 2012-11-12 20:56 BRST
Interesting ports on localhost (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
5432/tcp open  postgresql

Nmap done: 1 IP address (1 host up) scanned in 0.05 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
  • 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 12 20:57:32 mail postfix/smtpd[11581]: connect from localhost[127.0.0.1]
Nov 12 20:57:32 mail postfix/smtpd[11581]: 90E9FE235: client=localhost[127.0.0.1]
Nov 12 20:57:32 mail postfix/cleanup[11588]: 90E9FE235: message-id=<20121112225732.90E9FE235@mail.douglasqsantos.com.br>
Nov 12 20:57:32 mail postfix/qmgr[5898]: 90E9FE235: from=<douglas@douglasqsantos.com.br>, size=495, nrcpt=1 (queue active)
Nov 12 20:57:32 mail postfix/smtpd[11581]: disconnect from localhost[127.0.0.1]
Nov 12 20:57:32 mail postfix/virtual[11589]: 90E9FE235: to=<douglas@douglasqsantos.com.br>, relay=virtual, delay=0.04, delays=0.01/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
Nov 12 20:57:32 mail postfix/qmgr[5898]: 90E9FE235: remove

Agora vamos testar a autenticação do Cliente.

testsaslauthd -u douglas@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@douglasqsantos.com.br
Base64 encode é : ZG91Z2xhc0Bkb3VnbGFzLndpa2kuYnI=
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@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@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@douglasqsantos.com.br
ZG91Z2xhc0Bkb3VnbGFzLndpa2kuYnI=
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@douglasqsantos.com.br>
250 2.1.0 Ok
rcpt to: <douglas@douglasqsantos.com.br>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
From: Douglas <douglas@douglasqsantos.com.br>
To: Douglas <douglas@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=TI/CN=mail.douglasqsantos.com.br/emailAddress=douglas@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@douglasqsantos.com.br
verify return:1
---
Certificate chain
 0 s:/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=TI/CN=mail.douglasqsantos.com.br/emailAddress=douglas@douglasqsantos.com.br
   i:/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=TI/CN=mail.douglasqsantos.com.br/emailAddress=douglas@douglasqsantos.com.br
-----BEGIN CERTIFICATE-----
MIICpzCCAhACCQCNYYi667jJpjANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMC
QlIxDzANBgNVBAgTBlBhcmFuYTERMA8GA1UEBxMIQ3VyaXRpYmExEDAOBgNVBAoT
B0RvdWdsYXMxCzAJBgNVBAsTAlRJMR0wGwYDVQQDExRtYWlsLmRvdWdsYXMud2lr
aS5icjEmMCQGCSqGSIb3DQEJARYXZG91Z2xhc0Bkb3VnbGFzLndpa2kuYnIwHhcN
MTIxMDA0MTc1NzEyWhcNMjIxMDAyMTc1NzEyWjCBlzELMAkGA1UEBhMCQlIxDzAN
BgNVBAgTBlBhcmFuYTERMA8GA1UEBxMIQ3VyaXRpYmExEDAOBgNVBAoTB0RvdWds
YXMxCzAJBgNVBAsTAlRJMR0wGwYDVQQDExRtYWlsLmRvdWdsYXMud2lraS5icjEm
MCQGCSqGSIb3DQEJARYXZG91Z2xhc0Bkb3VnbGFzLndpa2kuYnIwgZ8wDQYJKoZI
hvcNAQEBBQADgY0AMIGJAoGBAMOdgm3xKBSrq0zCLvNFjkvlb8Zj6f8/0YbrAZV7
/bfUmCWus/h7PES4Eh7TnQF/b+EIQItQ9oBB1XG6t0+nOoAsfli11qFa3z8eSqCI
vECpXZCrzOYQwicRztA2Zoaie8WMCPiKE0kvXW5ps/vUu8aPCdxmMN/xXzhLnlm3
fXajAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAZ7X/Wnz9cM6Ty/03ukMr0q0lj1cw
YZk2bMDnDtOL17X8mNtwRCHOFgKh2sk9Xh80xxJqMlcbHVdCqxLKBfUEwwifj35/
uXe61BADWKsy+p6bjo6tLtE0FEHkwGu/afguHtMmW/9FPXiv1DQloj5A7+T92UT6
SnESkeuJoy+Bfos=
-----END CERTIFICATE-----
---
Server certificate
subject=/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=TI/CN=mail.douglasqsantos.com.br/emailAddress=douglas@douglasqsantos.com.br
issuer=/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=TI/CN=mail.douglasqsantos.com.br/emailAddress=douglas@douglasqsantos.com.br
---
Acceptable client certificate CA names
/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=TI/CN=mail.douglasqsantos.com.br/emailAddress=douglas@douglasqsantos.com.br
---
SSL handshake has read 1671 bytes and written 366 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: 938A6DEB769A3209B4C95D4695C74D4E3337F77B9AD334E40374C5759462B3AB
    Session-ID-ctx: 
    Master-Key: 2A46F82490908839CB5C87E7F3DEAE7383187FDE338C542C499082A12D0CE2E63A7D9DCAA2815C00D8D3F5B740C6C006
    Key-Arg   : None
    Start Time: 1349382058
    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 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Hello there.
user douglas@douglasqsantos.com.br
+OK Password required.
pass doug123
l+OK logged in.
list
+OK POP3 clients that break here, they violate STD53.
1 982
.
retr 1
+OK 982 octets follow.
Return-Path: <douglas@douglasqsantos.com.br>
X-Original-To: douglas@douglasqsantos.com.br
Delivered-To: douglas@douglasqsantos.com.br
Received: from localhost (localhost [127.0.0.1])
        by mail.douglasqsantos.com.br (Postfix) with ESMTP id 3354E11F51
        for <douglas@douglasqsantos.com.br>; Tue,  2 Oct 2012 16:25:21 -0300 (BRT)
Received: from mail.douglasqsantos.com.br ([127.0.0.1])
        by localhost (mail.douglasqsantos.com.br [127.0.0.1]) (amavisd-new, port 10024)
        with ESMTP id FTU91CRKqv-J for <douglas@douglasqsantos.com.br>;
        Tue,  2 Oct 2012 16:25:19 -0300 (BRT)
Received: from 10.101.0.25 (localhost [127.0.0.1])
        by mail.douglasqsantos.com.br (Postfix) with ESMTP id B3C1611F4E
        for <douglas@douglasqsantos.com.br>; Tue,  2 Oct 2012 16:25:18 -0300 (BRT)
To: douglas@douglasqsantos.com.br
From: douglas@douglasqsantos.com.br
Subject: Bem-vindo(a)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Message-Id: <20121002192518.B3C1611F4E@mail.douglasqsantos.com.br>
Date: Tue,  2 Oct 2012 16:25:18 -0300 (BRT)
 
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@douglasqsantos.com.br
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@douglasqsantos.com.br
verify return:1
+OK Hello there.
user douglas@douglasqsantos.com.br
+OK Password required.
pass doug123
+OK logged in.
list
+OK POP3 clients that break here, they violate STD53.
1 625
2 7541
3 2304
4 6702
5 1286
.
retr 1
+OK 625 octets follow.
Return-Path: <douglas@douglasqsantos.com.br>
X-Original-To: douglas@douglasqsantos.com.br
Delivered-To: douglas@douglasqsantos.com.br
Received: from 10.101.0.25 (localhost [127.0.0.1])
  by mail.douglasqsantos.com.br (Postfix) with ESMTP id 41BEA11F4A
  for <douglas@douglasqsantos.com.br>; Thu,  4 Oct 2012 15:05:29 -0300 (BRT)
To: douglas@douglasqsantos.com.br
From: douglas@douglasqsantos.com.br
Subject: Bem-vindo(a)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Message-Id: <20121004180529.41BEA11F4A@mail.douglasqsantos.com.br>
Date: Thu,  4 Oct 2012 15:05:29 -0300 (BRT)

Hi,

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

Agora vamos efetuar um teste com o Imap

telnet localhost 143
Trying 127.0.0.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-2010 Double Precision, Inc.  See COPYING for distribution information.
a login douglas@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 1349207001] Ok
* OK [MYRIGHTS "acdilrsw"] ACL
a OK [READ-ONLY] Ok
a fetch 1 body[]
* 1 FETCH (BODY[] {982}
Return-Path: <douglas@douglasqsantos.com.br>
X-Original-To: douglas@douglasqsantos.com.br
Delivered-To: douglas@douglasqsantos.com.br
Received: from localhost (localhost [127.0.0.1])
        by mail.douglasqsantos.com.br (Postfix) with ESMTP id 3354E11F51
        for <douglas@douglasqsantos.com.br>; Tue,  2 Oct 2012 16:25:21 -0300 (BRT)
Received: from mail.douglasqsantos.com.br ([127.0.0.1])
        by localhost (mail.douglasqsantos.com.br [127.0.0.1]) (amavisd-new, port 10024)
        with ESMTP id FTU91CRKqv-J for <douglas@douglasqsantos.com.br>;
        Tue,  2 Oct 2012 16:25:19 -0300 (BRT)
Received: from 10.101.0.25 (localhost [127.0.0.1])
        by mail.douglasqsantos.com.br (Postfix) with ESMTP id B3C1611F4E
        for <douglas@douglasqsantos.com.br>; Tue,  2 Oct 2012 16:25:18 -0300 (BRT)
To: douglas@douglasqsantos.com.br
From: douglas@douglasqsantos.com.br
Subject: Bem-vindo(a)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Message-Id: <20121002192518.B3C1611F4E@mail.douglasqsantos.com.br>
Date: Tue,  2 Oct 2012 16:25:18 -0300 (BRT)
 
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@douglasqsantos.com.br
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@douglasqsantos.com.br
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-2010 Double Precision, Inc.  See COPYING for distribution information.
a login douglas@douglasqsantos.com.br doug123
* OK [ALERT] 
a OK LOGIN Ok.
a list "" "*"
* LIST (\Marked \HasNoChildren) "." "INBOX"
a OK LIST completed
a examine inbox
* FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent)
* OK [PERMANENTFLAGS ()] No permanent flags permitted
* 5 EXISTS
* 5 RECENT
* OK [UIDVALIDITY 1349380413] Ok
* OK [MYRIGHTS "acdilrsw"] ACL
a OK [READ-ONLY] Ok
a fetch 1 body[]
* 1 FETCH (BODY[] {625}
Return-Path: <douglas@douglasqsantos.com.br>
X-Original-To: douglas@douglasqsantos.com.br
Delivered-To: douglas@douglasqsantos.com.br
Received: from 10.101.0.25 (localhost [127.0.0.1])
  by mail.douglasqsantos.com.br (Postfix) with ESMTP id 41BEA11F4A
  for <douglas@douglasqsantos.com.br>; Thu,  4 Oct 2012 15:05:29 -0300 (BRT)
To: douglas@douglasqsantos.com.br
From: douglas@douglasqsantos.com.br
Subject: Bem-vindo(a)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Message-Id: <20121004180529.41BEA11F4A@mail.douglasqsantos.com.br>
Date: Thu,  4 Oct 2012 15:05:29 -0300 (BRT)

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 ;)

Sincronismos de contas de Email entre servidores com o Fetchmail

apt-get install fetchmail liblockfile-simple-perl -y 
mkdir /var/run/fetchmail
touch /var/run/fetchmail/fetchmail-all.lock 

Vamos instalar as dependências

perl -MCPAN -e shell 
cpan[1]> force install DBI
cpan[2]> force install MIME::Base64
cpan[3]> force install File::Temp
cpan[4]> force install Sys::Syslog
cpan[5]> force install LockFile::Simple
cpan[6]> force install YAML
cpan[7]> q

Acertando o fetchmail

vim /var/www/postfixadmin/ADDITIONS/fetchmail.pl
[...]
#our $db_type = ‘Pg’;
my $db_type = 'mysql';

# host name
our $db_host="127.0.0.1";
# database name
our $db_name="mail";
# database username
our $db_username="mail";
# database password
our $db_password="123";

# instead of changing this script, you can put your settings to /etc/mail/postfixadmin/fetchmail.conf
# just use perl syntax there to fill the variables listed above (without the "our" keyword). Example:
#Deixar as linhas abaixo comentadas por padrão elas vem descomentadas
# $db_username = 'mail';
#if (-f "/etc/mail/postfixadmin/fetchmail.conf") {
#       require "/etc/mail/postfixadmin/fetchmail.conf";
#}

Acertando as permissões do fetchmail

chmod 755 /var/www/postfixadmin/ADDITIONS/fetchmail.pl 

Ajuste o Crontab para efetuar sincronismo das contas aqui estou agendando para ser efetuado a cada 10 minutos acerte de acordo com a necessidade.

crontab -e
* */10      *       *       *       /usr/bin/perl /var/www/postfixadmin/ADDITIONS/fetchmail.pl

Sincronismo de contas de e-mail entre servidores Para que o servidor já inicie o sincronismo das contas de e-mail do servidor atual, configuraremos as contas da seguinte forma:

  • Acesse o frontend do postfixadmin:
  • Clique no menu Recuperar Mensagem
  • Clique no Sub-menu Criar novo registro
  • Selecione a conta
  • Informar o servidor:
  • Autenticação : password
  • Usuario: email@dominio.com.br
  • Senha: senha
  • Diretorio: INBOX
  • Checar: 10
  • Recuperar todas: Marcar
  • Manter: Marcar
  • Protocolo: IMAP
  • Agora GRAVAR.

Instalando e configurando o RoundCubeMail

Vamos obter ele e desempacotar

mkdir /var/www/webmail
cd /var/www/webmail
wget -c http://wiki.douglasqsantos.com.br/Downloads/mail/roundcubemail-0.8.3.tar.gz
tar -xzvf roundcubemail-0.8.3.tar.gz
rm -rf roundcubemail-0.8.3.tar.gz
mv roundcubemail-0.8.3/* .
rm -rf roundcubemail-0.8.3

Agora vamos preparar o banco de dados para o webmail

psql -U postgres -h localhost
create user webmail with password 'senha';
create database webmail with owner webmail;
\q

Vamos acertar as permissões do webmail

chown -R www-data:www-data /var/www/webmail

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

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

Agora precisamos reiniciar o apache

/etc/init.d/apache2 restart

Agora vamos acertar os arquivos de configuração

cd /var/www/webmail/config
cp db.inc.php.dist db.inc.php
cp main.inc.php.dist main.inc.php

Vamos acertar o arquivo de conexão com o banco de dados

sed -i "s|mysql://roundcube:pass@localhost/roundcubemail|pgsql://webmail:senha@localhost/webmail|g" db.inc.php

Vamos acertar a configuração do arquivo de configuração principal do webmail

sed -i "s,\$rcmail_config\['default_host'\] = '';,\$rcmail_config\['default_host'\] = 'ssl://localhost';,g" /var/www/webmail/config/main.inc.php
sed -i "s,\$rcmail_config\['default_port'\] = 143;,\$rcmail_config\['default_port'\] = 993;,g" /var/www/webmail/config/main.inc.php
sed -i "s,\$rcmail_config\['smtp_server'\] = '';,\$rcmail_config\['smtp_server'\] = 'tls://localhost';,g" /var/www/webmail/config/main.inc.php
sed -i "s,\$rcmail_config\['smtp_port'\] = 25;,\$rcmail_config\['smtp_port'\] = 587;,g" /var/www/webmail/config/main.inc.php
sed -i "s,\$rcmail_config\['smtp_user'\] = '';,\$rcmail_config\['smtp_user'\] = '%u';,g" /var/www/webmail/config/main.inc.php
sed -i "s,\$rcmail_config\['smtp_pass'\] = '';,\$rcmail_config\['smtp_pass'\] = '%p';,g" /var/www/webmail/config/main.inc.php
sed -i "s,\$rcmail_config\['plugins'\] = array();,\$rcmail_config\['plugins'\] = array(\"password\");,g" /var/www/webmail/config/main.inc.php
sed -i "s,\$rcmail_config\['language'\] = null;,\$rcmail_config\['language'\] = 'pt_BR';,g" /var/www/webmail/config/main.inc.php
sed -i "s,\$rcmail_config\['drafts_mbox'\] = 'Drafts';,\$rcmail_config\['drafts_mbox'\] = 'Rascunhos';,g" /var/www/webmail/config/main.inc.php
sed -i "s,\$rcmail_config\['junk_mbox'\] = 'Junk';,\$rcmail_config\['junk_mbox'\] = 'Spam';,g" /var/www/webmail/config/main.inc.php
sed -i "s,\$rcmail_config\['sent_mbox'\] = 'Sent';,\$rcmail_config\['sent_mbox'\] = 'Enviados';,g" /var/www/webmail/config/main.inc.php
sed -i "s,\$rcmail_config\['trash_mbox'\] = 'Trash';,\$rcmail_config\['trash_mbox'\] = 'Lixeira';,g" /var/www/webmail/config/main.inc.php
sed -i "s,\$rcmail_config\['create_default_folders'\] = false;,\$rcmail_config\['create_default_folders'\] = true;,g" /var/www/webmail/config/main.inc.php
sed -i "s,\$rcmail_config\['mime_param_folding'\] = 1;,\$rcmail_config\['mime_param_folding'\] = 0;,g" /var/www/webmail/config/main.inc.php
sed -i "s/\$rcmail_config\['default_folders'\] = array('INBOX', 'Drafts', 'Sent', 'Junk', 'Trash');/\$rcmail_config\['default_folders'\] = array('INBOX', 'Rascunhos', 'Enviados', 'Spam', 'Lixeira');/g" /var/www/webmail/config/main.inc.php

Agora vamos acertar o plugin do roundcubemail para que o usuário possa trocar a senha.

cd /var/www/webmail/plugins/password
cp config.inc.php.dist config.inc.php

Agora vamos acertar a configuração sobre qual tabela o webmail vai ter que atualizar no banco, e a query que vamos enviar para o banco para mandar atualizar a senha.

sed -i "s,\$rcmail_config\['password_db_dsn'\] = '';,\$rcmail_config\['password_db_dsn'\] = 'pgsql://webmail:senha@localhost/mail';,g" /var/www/webmail/plugins/password/config.inc.php
sed -i "s/\$rcmail_config\['password_query'\] = 'SELECT update_passwd(%c, %u)';/\$rcmail_config\['password_query'\] = 'UPDATE mailbox SET password=%c,modified=NOW() WHERE username=%u';/g" /var/www/webmail/plugins/password/config.inc.php

Agora precisamos dar permissão para o webmail atualizar a tabela mailbox do banco mail.

psql -h localhost -U mail
Senha para usuário mail: #senha
psql (8.4.13)
Digite "help" para ajuda.
mail=> grant select,update on table mailbox to webmail;
GRANT
mail=> \q

Inicialize o banco

psql -h localhost -U webmail -d webmail  < /var/www/webmail/SQL/postgres.initial.sql

Removendo o instalador do Webmail:

rm -rf /var/www/webmail/installer

Nosso webmail já esta no ar para testar acesse http://ip_servidor/webmail informe o usuário e senha

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.

Fazendo backup das bases de dados

Para efetuarmos o backup das bases de dados podemos fazer da seguinte forma

pg_dumpall -i -h localhost -U postgres -c -o -f bancos.dump

No comando acima estamos fazendo backup de todos os bancos disponíveis no PostgreSQL, eu acho o mais correto pois não podemos nada.

Para restaurar todos os bancos podemos fazer da seguinte forma

psql -h localhost -U postgres -f bancos.dump

No comando acima estamos restaurando todos os banco de dados do PostgreSQL.

Caso precise efetuar o backup de somente um banco pode exemplo o banco dos emails podemos fazer da seguinte forma

pg_dump mail -i -h localhost -U postgres -c -o -f mail.dump

Para restaurar o backup deste banco podemos fazer da seguinte forma

psql -h localhost -U postgres -f mail.dump

Para que o sistema não fique solicitando a senha podemos fazer o backup e o restore utilizando o usuário postgres do sistema da seguinte forma no servidor

su - postgres
postgres@mail:~$ pg_dumpall -i -c -o -f bancos.dump

Agora para efetuar o restore

su - postgres
postgres@mail:~$ psql -f bancos.dump

Simples fácil e rápido ;)

Referências