Servidor de Email
Índice
Postfix
Neste tutorial será mostrado como configurar um servidor de e-mails usando Postfix, a proposta de uso deste servidor é apenas para envio de notificações de sistemas internos (Zabbix, Moodle, Booked Scheduler, Scan-to-mail das impressoras) sem a intenção de disponibilizar o serviço SMTP para usuários, então não será necessário a criação de domínios virtuais, autenticação em bancos de dados externos nem a instalação de serviços de recebimento de e-mail como POP e IMAP.
Informações iniciais
Domínio: exemplo.com.br
IPv4: 192.0.2.4
IPv6: 2001:0DB8::4
Hostname: email.exemplo.com.br
S.O.: Debian 8 (Jessie)
Versão do Postfix: 2.11.3
Instalação do Postfix
# apt-get install postfix
Ao apresentar a janela solicitando o tipo de configuração do servidor de e-mail, selecione:
Site da Internet
Na próxima janela "nome de email" digite:
email.exemplo.com.br
Configuração
Edite o arquivo de configuração /etc/postfix/main.cf
smtpd_banner = $myhostname ESMTP $mail_name
biff = no
append_dot_mydomain = no
readme_directory = no
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_CApath = /etc/ssl/certs
myhostname = email.exemplo.com.br
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = email.exemplo.com.br, localhost.exemplo.com.br, localhost
# clientes cadastrados em mynetworks podem enviar emails sem autenticacao:
mynetworks = 192.0.2.0/24, localhost
relayhost =
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
# Politicas de segunranca.
smtpd_relay_restrictions = permit_mynetworks
permit_sasl_authenticated defer_unauth_destination
# Rejeitar e-mails de dominios que nao existem
smtp_sender_restrictions = reject_unknown_sender_domain,
reject_non_fqdn_sender
## Utilizadores locais podem enviar e-mails para qualquer endereco
smtpd_recipient_restrictions = permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination
# Delay para e-mails com o mesmo dominio de destino, para evitar congestionamento, valor em segundos.
default_destination_rate_delay = 1
Com esta configuração básica, já é possível realizar o primeiro teste de envio com o comando:
# echo "body of your email" | mail -s "This is a Subject" -a "From: envio@exemplo.com.br" destino@destino.com
e observe o arquivo de log para monitorar o envio:
# tail -f /var/log/mail.log
Se houver um firewall na rede, libere a porta 25 de SAÍDA para qualquer IP de destino, não libere a porta 25 de entrada caso contrário você estará assumindo uma falha de segurança chamado Open Relay.
Evitar que seu e-mail caia no SPAM
É possível que seu e-mail de teste caia na caixa de spam do destinatário, ou pior, o IP do seu servidor cair em uma blacklist de servidores Spammers, isto ocorre pois alguns servidores de e-mail (Gmail, Terra, Outlook entre outros) utilizam algumas políticas rigorosas para o controle de spam, para resolver o problema é necessário implementar alguns métodos de segurança.
Para tornar o servidor confiável aos olhos do servidor destinatário é preciso de 4 componentes:
- rDNS (DNS Reverso)
- SPF
- DKIM
- DMARC
rDNS [1]
Acesse o seu servidor de DNS e configure a zona exemplo.com.br inserindo o seguinte registro:
email IN A 192.0.2.4 email IN AAAA 2001:0DB8::4 email IN MX 1 email.exemplo.com.br.
na zona reversa IPv4 2.0.192.in-addr.arpa insira:
4 IN PTR email.exemplo.com.br.
e zona reversa IPv6 0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa insira:
4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR email.exemplo.com.br.
De fora de sua rede, utilize o seguinte comando para verificar se o DNS reverso esta configurado corretamente:
dig -x 192.0.2.4 @IP.SERVIDOR.DNS
Se retornar email.exemplo.com.br esta funcionando corretamente, se não funcionar vide Servidor de DNS reverso.
SPF[2]
SPF é uma tecnologia para combater a falsificação de endereços de retorno dos emails (return-path). O mecanismo permite ao administrador de um domínio defina uma política SPF, onde são designados os endereços das máquinas autorizadas a enviar mensagens em nome do seu domínio e estabelecer critérios de aceitação de mensagens em função da checagem das políticas SPF publicadas.[3]
Instale o pacote com o comando:
# apt-get install postfix-policyd-spf-perl
Adicione o parâmetro abaixo no arquivo /etc/postfix/main.cf
policy-spf_time_limit = 3600s
e adicione o valor
check_policy_service unix:private/policy-spf
no final do parâmetro smtpd_recipient_restrictions, exemplo abaixo:
smtpd_recipient_restrictions = permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination,
check_policy_service unix:private/policy-spf
Adicione as seguintes linhas no arquivo /etc/postfix/master.cf
policy-spf unix - n n - - spawn
user=nobody argv=/usr/sbin/postfix-policyd-spf-perl
Pra finalizar, no servidor de DNS o seguinte registro do tipo TXT na zona exemplo.com.br, informando o IP do servidor de e-mail autorizado a usar o domínio exemplo.com.br como remetente:
email IN TXT "v=spf1 ip6:2001:0DB8::4 ip4:192.0.2.4 -all"
DKIM [4]
# apt-get install opendkim opendkim-tools
Edite o arquivo /etc/opendkim.conf
AutoRestart Yes AutoRestartRate 10/1h UMask 002 Syslog yes SyslogSuccess Yes LogWhy Yes Canonicalization relaxed/simple ExternalIgnoreList refile:/etc/opendkim/TrustedHosts InternalHosts refile:/etc/opendkim/TrustedHosts KeyTable refile:/etc/opendkim/KeyTable SigningTable refile:/etc/opendkim/SigningTable Mode sv PidFile /var/run/opendkim/opendkim.pid Socket inet:12345@localhost SignatureAlgorithm rsa-sha256 OversignHeaders From
Edite o arquivo /etc/default/opendkim e altere para:
SOCKET="inet:12345@localhost"
No arquivo de configuração /etc/postfix/main.cf acrescente os parâmetros abaixo:
milter_protocol = 2 milter_default_action = accept
Para melhor organização crie um diretório opendkim e criar os arquivos abaixo:
# mkdir /etc/opendkim # touch /etc/opendkim/TrustedHosts # touch /etc/opendkim/KeyTable # touch /etc/opendkim/SigningTable # touch /etc/opendkim/keys
No arquivo /etc/opendkim/TrustedHosts adicione os hosts que podem enviar e-mails assinados:
localhost email.exemplo.com.br
Gerar chave privada e pública com o comando:
opendkim-genkey -s seletor -d exemplo.com.br
Salve a chave privata seletor.private na pasta /etc/opendkim/keys e proteja o acesso:
chown opendkim:opendkim seletor.private
Edite o arquivo de tabela de chaves /etc/opendkim/KeyTable
seletor._domainkey.exemplo.com.br exemplo.com.br:seletor:/etc/opendkim/keys/exemplo.com.br/seletor.private
Edite a tabela de assinaturas /etc/opendkim/SigningTable
*@exemplo.com.br seletor._domainkey.exemplo.com.br
Pra finalizar adicione no servidor de DNS um registro do tipo TXT constando a chave pública gerada pelo comando opendkim-genkey, arquivo seletor.txt:
seletor._domainkey IN TXT "v=DKIM1\; k=rsa\; p=ADDLLSKKCKAKSSSKALS..."
Reinicie os serviços:
# systemctl restart postfix # systemctl restart opendkim
Realize um teste de envio de e-mail, para confirmar visualize o arquivo de log mail.log e verifique se a seguinte informação consta no log "DKIM-Signature field added"
DMARC
Testes
Cliente de e-mail
PHPMailer
$mail = new PHPMailer();
$mail->Host = "IP.DO.SERVIDOR";
$mail->SMTPKeepAlive = true;
$mail->Debugoutput = 'html';
$mail->IsSMTP();
$mail->Port = 587;
$mail->SMTPAutoTLS = true;
$mail->SMTPSecure = 'tls';
//$mail->SMTPDebug = 3; // Opcional
$mail->SMTPAuth = true;
$mail->Username = "usuario";
$mail->Password = "senha";
$mail->CharSet = 'UTF-8';
$mail->SetFrom('usuario@exemplo.com.br', 'Fulano');
// $mail->AddReplyTo('email@exemplo.com.br', 'Ciclano'); // Opcional
$mail->IsHTML(true);
$mail->Subject = "Assunto";
$mail->setLanguage('pt-br');
$mail->AltBody = "";
$body = "Corpo do e-mail aqui";
$mail->MsgHTML($body);
$mail->AddAddress("e-mail do destinatário aqui");
if (!$mail->Send())
//erro
else
//sucesso