Postfix e MySQL · 8 min read · Sep 28, 2025

Usuários Virtuais E Domínios Com Postfix, Courier, MySQL E SquirrelMail (Mandriva 2009.1 x86_64) - Página 4

10 Instalar Razor, Pyzor E DCC E Configurar SpamAssassin

Razor, Pyzor e DCC são filtros de spam que usam uma rede de filtragem colaborativa. Para instalar Razor, Pyzor e DCC, execute

urpmi perl-Razor-Agent pyzor dcc

Em seguida, inicialize Razor e Pyzor:

chmod -R a+rX /usr/share/doc/pyzor /usr/bin/pyzor /usr/bin/pyzord  
chmod -R a+rX /usr/lib/python2.6/site-packages/pyzor  
chown amavis:amavis /var/spool/amavis/  
su -m amavis -c 'pyzor --homedir /var/spool/amavis discover'  
su -m amavis -c 'razor-admin -home=/var/spool/amavis -create'  
su -m amavis -c 'razor-admin -home=/var/spool/amavis -register'

Agora precisamos dizer ao SpamAssassin para usar esses três programas. Edite /etc/mail/spamassassin/local.cf para que fique assim:

cp /etc/mail/spamassassin/local.cf /etc/mail/spamassassin/local.cf_orig  
cat /dev/null > /etc/mail/spamassassin/local.cf  
vi /etc/mail/spamassassin/local.cf

| # dcc use_dcc 1 dcc_path /usr/bin/dccproc #pyzor use_pyzor 1 pyzor_path /usr/bin/pyzor #razor use_razor2 1 razor_config /var/spool/amavis/razor-agent.conf #bayes use_bayes 1 use_bayes_rules 1 bayes_auto_learn 1 |

Em seguida, devemos habilitar o plugin DCC no SpamAssassin. Abra /etc/mail/spamassassin/v310.pre e descomente a linha loadplugin Mail::SpamAssassin::Plugin::DCC:

vi /etc/mail/spamassassin/v310.pre

| [...] # DCC - realizar verificações de mensagens DCC. # # DCC está desativado aqui porque não é código aberto. Veja a licença do DCC # para mais detalhes. # loadplugin Mail::SpamAssassin::Plugin::DCC [...] |

Você pode verificar sua configuração do SpamAssassin executando:

spamassassin --lint

Não deve mostrar nenhum erro.

Execute

/etc/init.d/amavisd restart

depois.

Agora atualizamos nossos conjuntos de regras do SpamAssassin da seguinte forma:

sa-update --no-gpg

Criamos um trabalho cron para que os conjuntos de regras sejam atualizados regularmente. Execute

crontab -e

para abrir o editor de trabalho cron. Crie o seguinte trabalho cron:

| 23 4 */2 * * /usr/bin/sa-update --no-gpg &> /dev/null |

Isso atualizará os conjuntos de regras a cada dois dias às 4:23h.

11 Notificações de Excesso de Quota

Se você deseja receber notificações sobre todas as contas de e-mail que estão acima da quota, crie o arquivo /usr/local/sbin/quota_notify:

cd /usr/local/sbin/  
vi quota_notify

| #!/usr/bin/perl -w # Autor <[email protected]> # # Este script assume que virtual_mailbox_base está definido # no arquivo main.cf do postfix. Este diretório é assumido para conter # diretórios que contêm os maildirs dos seus usuários virtuais. # Por exemplo: # # -----------/ # | # | # home/vmail/domains/ # | | # | | # example.com/ foo.com/ # | # | # ----------------- # | | | # | | | # user1/ user2/ user3/ # | # | # maildirsize # use strict; my $POSTFIX_CF = "/etc/postfix/main.cf"; my $MAILPROG = "/usr/sbin/sendmail -t"; my $WARNPERCENT = 80; my @POSTMASTERS = ('[email protected]'); my $CONAME = 'Minha Empresa'; my $COADDR = '[email protected]'; my $SUADDR = '[email protected]'; my $MAIL_REPORT = 1; my $MAIL_WARNING = 1; #get virtual mailbox base from postfix config open(PCF, "< $POSTFIX_CF") or die $!; my $mboxBase; while () { next unless /virtual_mailbox_base\s*=\s*(.*)\s*/; $mboxBase = $1; } close(PCF); #assume one level of subdirectories for domain names my @domains; opendir(DIR, $mboxBase) or die $!; while (defined(my $name = readdir(DIR))) { next if $name =~ /^\.\.? ; #skip '.' and '..' next unless (-d "$mboxBase/$name"); push(@domains, $name); } closedir(DIR); #iterate through domains for username/maildirsize files my @users; chdir($mboxBase); each my $domain (@domains) { opendir(DIR, $domain) or die $!; while (defined(my $name = readdir(DIR))) { next if $name =~ /^\.\.? ; #skip '.' and '..' next unless (-d "$domain/$name"); push(@users, {"$name\@$domain" => "$mboxBase/$domain/$name"}); } } closedir(DIR); #get user quotas and percent used my (%lusers, $report); each my $href (@users) { foreach my $user (keys %$href) { my $quotafile = "$href->{$user}/maildirsize"; next unless (-f $quotafile); open(QF, "< $quotafile") or die $!; my ($firstln, $quota, $used); while () { my $line = $_; if (! $firstln) { $firstln = 1; die "Erro: arquivo de quota corrompido $quotafile" unless ($line =~ /^\d+)S/); $quota = $1; last if (! $quota); next; } die "Erro: arquivo de quota corrompido $quotafile" unless ($line =~ /\s*(-?\d+)/); $used += $1; } close(QF); next if (! $used); my $percent = int($used / $quota * 100); $lusers{$user} = $percent unless not $percent; } } #send a report to the postmasters if ($MAIL_REPORT) { open(MAIL, "| $MAILPROG"); select(MAIL); map {print "Para: $_\n"} @POSTMASTERS; print "De: $COADDR\n"; print "Assunto: Relatório Diário de Quota.\n"; print "RELATÓRIO DIÁRIO DE QUOTA:\n\n"; print "----------------------------------------------\n"; print "| % USO | NOME DA CONTA |\n"; print "----------------------------------------------\n"; foreach my $luser ( sort { $lusers{$b} <=> $lusers{$a} } keys %lusers ) { printf("| %3d | %32s |\n", $lusers{$luser}, $luser); print "---------------------------------------------\n"; } print "\n--\n"; print "$CONAME\n"; close(MAIL); } #email a warning to people over quota if ($MAIL_WARNING) { foreach my $luser (keys (%lusers)) { next unless $lusers{$luser} >= $WARNPERCENT; # skip those under quota open(MAIL, "| $MAILPROG"); select(MAIL); print "Para: $luser\n"; map {print "BCC: $_\n"} @POSTMASTERS; print "De: $SUADDR\n"; print "Assunto: AVISO: Sua caixa de entrada está $lusers{$luser}% cheia.\n"; print "Responder a: $SUADDR\n"; print "Sua caixa de entrada: $luser está $lusers{$luser}% cheia.\n\n"; print "Uma vez que sua caixa de e-mail excedeu sua quota de armazenamento mensal\n"; print "sua cobrança mensal será ajustada automaticamente.\n"; print "Por favor, considere excluir e-mails e esvaziar sua pasta de lixo para liberar espaço.\n\n"; print "Entre em contato <$SUADDR> para mais assistência.\n\n"; print "Obrigado.\n\n"; print "--\n"; print "$CONAME\n"; close(MAIL); } } |

Certifique-se de ajustar as variáveis no topo (especialmente o endereço de e-mail [email protected]).

Devemos tornar o arquivo executável:

chmod 755 quota_notify

Execute

crontab -e

para criar um trabalho cron para esse script:

| 0 0 * * * /usr/local/sbin/quota_notify &> /dev/null |

12 Testar Postfix

Para ver se o Postfix está pronto para SMTP-AUTH e TLS, execute

telnet localhost 25

Depois de estabelecer a conexão com seu servidor de e-mail Postfix, digite

ehlo localhost

Se você ver as linhas

*250-STARTTLS *

e

*250-AUTH PLAIN *LOGIN**

tudo está bem.

[root@server1 sbin]# telnet localhost 25  
Tentando 127.0.0.1...  
Conectado a localhost.localdomain (127.0.0.1).  
O caractere de escape é '^]'.  
220 server1.example.com ESMTP Postfix (2.5.6) (Mandriva Linux)  
ehlo localhost  
250-server1.example.com  
250-PIPELINING  
250-SIZE 10240000  
250-VRFY  
250-ETRN  
250-STARTTLS  
250-AUTH PLAIN LOGIN  
250-AUTH=PLAIN LOGIN  
250-ENHANCEDSTATUSCODES  
250-8BITMIME  
250 DSN  
quit  
221 2.0.0 Bye  
Conexão fechada pelo host remoto.  
[root@server1 sbin]#

Digite

quit

para retornar ao shell do sistema.

13 Popular O Banco De Dados E Testar

Para popular o banco de dados, você pode usar o shell do MySQL:

mysql -u root -p
USE mail;

Pelo menos você deve criar entradas nas tabelas domains e users:

INSERT INTO `domains` (`domain`) VALUES ('example.com');  
INSERT INTO `users` (`email`, `password`, `quota`) VALUES ('[email protected]', ENCRYPT('secret'), 10485760);

(Por favor, tenha cuidado para usar a sintaxe ENCRYPT na segunda instrução INSERT para criptografar a senha!)

Se você quiser fazer entradas nas outras duas tabelas, isso seria assim:

INSERT INTO `forwardings` (`source`, `destination`) VALUES ('[email protected]', '[email protected]');  
INSERT INTO `transport` (`domain`, `transport`) VALUES ('example.com', 'smtp:mail.example.com');

Para sair do shell do MySQL, digite

quit;

Para a maioria das pessoas, é mais fácil se tiver uma interface gráfica para o MySQL; portanto, você também pode usar o phpMyAdmin (neste exemplo sob http://192.168.0.100/phpmyadmin/ ou http://server1.example.com/phpmyadmin/) para administrar o banco de dados mail. Novamente, ao criar um usuário, certifique-se de usar a função ENCRYPT para criptografar a senha:

Não acho que eu precise explicar mais sobre as tabelas de domínios e usuários.

A tabela de encaminhamentos pode ter entradas como as seguintes:

sourcedestination
[email protected][email protected]Redireciona e-mails para [email protected] para [email protected]
@example.com[email protected]Cria uma conta Catch-All para [email protected]. Todos os e-mails para example.com chegarão a [email protected], exceto aqueles que existem na tabela de usuários (ou seja, se [email protected] existir na tabela de usuários, os e-mails para [email protected] ainda chegarão a [email protected]).
@example.com@anotherdomain.tldIsso redireciona todos os e-mails para example.com para o mesmo usuário em anotherdomain.tld. Por exemplo, e-mails para [email protected] serão encaminhados para [email protected].
[email protected][email protected], [email protected]Encaminha e-mails para [email protected] para dois ou mais endereços de e-mail. Todos os endereços de e-mail listados sob o destino recebem uma cópia do e-mail.

A tabela de transporte pode ter entradas como estas:

domaintransport
example.com:Entrega e-mails para example.com localmente. Isso é como se esse registro não existisse nesta tabela.
example.comsmtp:mail.anotherdomain.tldEntrega todos os e-mails para example.com via smtp para o servidor mail.anotherdomain.com.
example.comsmtp:mail.anotherdomain.tld:2025Entrega todos os e-mails para example.com via smtp para o servidor mail.anotherdomain.com, mas na porta 2025, não 25, que é a porta padrão para smtp.

| example.com | smtp:[1.2.3.4]
smtp:[1.2.3.4]:2025
smtp:[mail.anotherdomain.tld] | Os colchetes impedem o Postfix de fazer buscas do registro MX DNS para o endereço entre colchetes. Faz sentido para endereços IP. | | .example.com | smtp:mail.anotherdomain.tld | O correio para qualquer subdomínio de example.com é entregue a mail.anotherdomain.tld. | | * | smtp:mail.anotherdomain.tld | Todos os e-mails são entregues a mail.anotherdomain.tld. | | [email protected] | smtp:mail.anotherdomain.tld | E-mails para [email protected] são entregues a mail.anotherdomain.tld. |

Veja

man transport

para mais detalhes.

Por favor, tenha em mente que a ordem das entradas na tabela de transporte é importante! As entradas serão seguidas de cima para baixo.

Importante: O Postfix usa um mecanismo de cache para os transportes, portanto, pode levar um tempo até que você veja as alterações na tabela de transporte terem efeito. Se você quiser que elas tenham efeito imediatamente, execute

postfix reload

depois de fazer suas alterações na tabela de transporte.

14 Enviar Um E-mail de Boas-Vindas Para Criar Maildir

Quando você cria uma nova conta de e-mail e tenta buscar e-mails dela (com POP3/IMAP), provavelmente receberá mensagens de erro dizendo que o Maildir não existe. O Maildir é criado automaticamente quando o primeiro e-mail chega para a nova conta. Portanto, é uma boa ideia enviar um e-mail de boas-vindas para uma nova conta. Por exemplo, para enviar um e-mail de boas-vindas para [email protected], fazemos isso:

mailx [email protected]

Você será solicitado a inserir o assunto. Digite o assunto (por exemplo, Boas-vindas), depois pressione ENTER, e na próxima linha digite sua mensagem. Quando a mensagem estiver concluída, pressione ENTER novamente para que você esteja em uma nova linha, depois pressione CTRL+D para finalizar o e-mail:

[root@server1 mail]# mailx [email protected]
Assunto: Boas-vindas <– ENTER
Boas-vindas! Divirta-se com sua nova conta de e-mail. <– ENTER
<– CTRL+D
EOT
[root@server1 mail]#

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.