O que você deseja fazer requer o tratamento de e-mails de usuários que usam seu servidor como seu MSA (ou seja, seu retransmissor de saída) com uma política diferente daqueles recebidos de terceiros (ou seja, quando seu servidor de e-mail está agindo em seu papel MX). Felizmente, o amavis tem a ferramenta certa para você: Bancos de Políticas.
Vamos ver como você pode definir uma política para seus usuários:
$policy_bank{'PREQ-SUB'} = {
originating => 1, # indicates client is ours, allows signing
final_spam_destiny => D_DISCARD, # discard spam
final_virus_destiny => D_DISCARD, # discard spam
warnspamsender => 1, # send a warning
forward_method => 'smtp:127.0.0.1:10025', # you probably need to adjust this
smtpd_discard_ehlo_keywords => ['8BITMIME'], # force mail conversion to Q/P
smtpd_greeting_banner => '${helo-name} ${protocol} ${product} SUBMISSION service ready',
spam_admin_maps => ["postmaster\@example.net"], # warn of spam from us
virus_admin_maps => ["postmaster\@example.net"], # warn of viruses from us
};
A partir da nomenclatura desse banco de políticas, você já pode adivinhar que estou executando isso como um filtro de pré-fila que é acionado se o email for entregue pela porta TCP de envio 587. Para que essa configuração funcione, eu disse Postfix MTA para entregar emails que o serviço de envio recebeu para localhost na porta 10028 (enquanto, ao agir como MX público, o servidor encaminha o email para a porta 10024). Para ativar duas portas no amavis e ligar a política PREQ-SUB à porta 10028, estou usando estas configurações:
# policy bank definition
$inet_socket_port = [10024, 10028]; # listen on listed inet tcp ports
$interface_policy{'10028'} = 'PREQ-SUB'; # mail submitted using TLS on submission/smtps port
A entrada master.cf correspondente para o Postfix é:
submission inet n - - - - smtpd -o smtpd_tls_security_level=encrypt
-o tls_preempt_cipherlist=$submission_tls_preempt_cipherlist
-o smtpd_tls_protocols=$submission_smtpd_tls_protocols
-o smtpd_tls_ciphers=$submission_smtpd_tls_ciphers
-o smtpd_tls_exclude_ciphers=$submission_smtpd_tls_exclude_ciphers
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipient_restrictions=$submission_smtpd_recipient_restrictions
-o milter_macro_daemon_name=ORIGINATING
-o smtpd_proxy_filter=127.0.0.1:10028
-o syslog_name=postfix-submission/smtpd
-o receive_override_options=no_header_body_checks
Observe que isso realmente faz um pouco mais do que simplesmente enviar e-mails para o amavis, por exemplo, definir listas de cifras e assim por diante (você notará as referências da variável main.cf).
Então, o que você pode fazer se seus usuários NÃO enviarem seus e-mails na porta 587, ou nem todos eles o fizerem? Bem, você terá que deixar a terra de 100% de certeza então. O amavis pode analisar o conteúdo de um e-mail e atuar sobre a presença de cabeçalhos. Um desses cabeçalhos pode ser o nome do usuário autenticado que o Postfix adiciona se você definir smtpd_sasl_authenticated_header = yes . Você poderia então dizer ao amavis para agir neste cabeçalho:
package Amavis::Custom;
use strict;
BEGIN {
import Amavis::Conf qw(:platform :confvars c cr ca $myhostname);
import Amavis::Util qw(do_log untaint safe_encode safe_decode);
import Amavis::rfc2821_2822_Tools;
import Amavis::Notify qw(build_mime_entity);
}
sub new {
my($class,$conn,$msginfo) = @_;
my($self) = bless {}, $class;
my $auth_sender = 0;
foreach my $line (@{$msginfo->{'orig_header'}}) {
$line =~ s/\n / /g;
# WARNING: you need to improve this to AT LEAST also match
# for your OWN mail servers name!
$auth_sender = 1 if $line =~ m/^Authenticated sender/i;
}
if ($auth_sender) {
do_log(2, sprintf("Load pre-queue submission policy bank"));
Amavis::load_policy_bank('PREQ-SUBMISSION')
}
return $self;
}
1; # insure a defined return
Por favor, não ignore o aviso dentro deste código: os cabeçalhos são facilmente legíveis, e outros servidores de e-mail podem inserir um cabeçalho "Autenticiado remetente" também, então é melhor combinar com "your-mailserver.example.net. * Remetente autenticado ".
Em uma nota final, com relação a um de seus comentários: Executar um servidor de e-mail requer muito tempo e exige que você o monitore constantemente por abuso. Não há cartão "saia da cadeia livre" quando se trata de participar do sistema global de e-mail!