Com a gentil ajuda de Benoît Panizzon na lista de discussão MIMEDefang, descobri que preciso usar inet
em vez de unix
como o soquete de escuta, para que ele esteja escutando na porta TCP no local ou remoto especificado hospedeiro. Então o procedimento de configuração para o MIMEDefang no Debian / Ubuntu é:
- Instalar o MIMEDefang:
apt install mimedefang
- Em
/etc/default/mimedefang
set (use outra porta se você quiser):SOCKET=inet:33333
- Adicionar a
/etc/postfic/main.cf
: %código% - Copie
smtpd_milters = inet:localhost:33333 milter_default_action = accept
para/etc/mimedefang-filter
e modifique-o de acordo com suas necessidades (não é necessário torná-lo executável). - Recarregue os serviços Postfix e MIMEDefang:
/etc/mail/mimedefang-filter
O MIMEDefang deve ser recarregado toda vez que você alterar sudo systemctl reload postfix mimedefang
.
A propósito, esta apresentação oferece uma boa compreensão do MIMEDefang: link
O script Perl real que está sendo executado está localizado em mimedefang-filter
, que então inclui /usr/bin/mimedefang.pl
.
Eu também queria poder escrever minha lógica de filtragem em PHP em vez de Perl, então eu criei a seguinte solução. Adicione isto ao final de, por exemplo. a função mimedefang-filter
em filter_begin
:
%passToPhp = ("Sender", $Sender, "Recipients", \@Recipients, "Subject", $Subject, "RelayAddr", $RelayAddr, "RelayHostname", $RelayHostname, "Helo", $Helo, "QueueID", $QueueID, "MessageID", $MessageID);
my $cmd = "/path/to/your/email-filter.php";
$cmd .= " " . encode_base64(encode_json(\%passToPhp), '');
my $phpOutput = '$cmd';
md_syslog('info', "PHP filter output: $phpOutput"); #causes entry in /var/log/mail.log
if ($phpOutput eq "bounce") {
action_bounce("We dont want this particular message.");
} elsif ($phpOutput eq "discard") {
action_discard();
}
Em seguida, use o seguinte código em mimedefang-filter
para você começar:
#!/usr/bin/php
<?php
// runs as user "defang". This file must have execute permissions.
// Get variables from mimedefang that we passed along, headers, raw message, and extra information from mimedefang
$arguments = ($argv[1] ? base64_decode($argv[1]) : null);
if ($arguments) $arguments = json_decode($arguments, true);
$headers = file_get_contents('HEADERS');
$raw_message = file_get_contents('INPUTMSG');
$commands = file_get_contents('COMMANDS');
// Get all the MIME parts into an array
$mimeparts = [];
chdir('./Work');
foreach (glob('*') as $mimepart_file) {
if (is_dir($file)) continue;
$mimeparts[$mimepart_file] = file_get_contents($mimepart_file);
}
// Do all your logic here...
if ($someLogic == 'spam') {
echo 'discard';
// echo 'bounce'; //use this line if you want to have a bounce message sent back to sender (but you probably don't want that for spam)
}
Monitore email-filter.php
para garantir que tudo funcione como deveria.