Как установить Mimedefang на Debian?

Я полагаю, что ssh в это время съедает остаток на stdin. Вы можете обратиться к FAQ 89 Bash для подробностей. При использовании FileDescriptor следующие коды должны работать, как вы ожидаете.

while read line <& 7
do
sshpass -p password ssh root@$line << EOF
hostname
uname -r
EOF
done 7< server.txt

0
25.10.2018, 23:56
1 ответ

С любезной помощью Benoît Panizzon из списка рассылки MIMEDefang я обнаружил, что мне нужно использовать inetвместо unixв качестве прослушивающего сокета, чтобы он прослушивал порт TCP на указанном локальном или удаленном хозяин. Таким образом, процедура установки MIMEDefang в Debian/Ubuntu:

  1. Установите MIMEDefang:apt install mimedefang
  2. В /etc/default/mimedefangустановите (используйте другой порт, если хотите):SOCKET=inet:33333
  3. Добавить к/etc/postfic/main.cf: smtpd_milters = inet:localhost:33333 milter_default_action = accept
  4. Скопируйте /etc/mimedefang-filterв /etc/mail/mimedefang-filterи измените его в соответствии с вашими потребностями (не нужно делать его исполняемым ).
  5. Перезагрузите сервисы Postfix и MIMEDefang:sudo systemctl reload postfix mimedefang

MIMEDefang необходимо перезагружать при каждом изменении mimedefang-filter.


Кстати, эта презентация дает хорошее представление о MIMEDefang:https://www.mimedefang.org/static/mimedefang-lisa04.pdf

Фактически выполняемый Perl-скрипт находится в /usr/bin/mimedefang.pl, который затем включает mimedefang-filter.


Я также хотел написать свою логику фильтрации на PHP вместо Perl, поэтому я придумал следующее решение. Добавьте это в конец, например. функция filter_beginвmimedefang-filter:

%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();
}

Затем используйте следующий код в email-filter.php, чтобы начать работу:

#!/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)
}

Контролируйте /var/log/mail.log, чтобы убедиться, что все работает должным образом.

0
28.01.2020, 04:11

Теги

Похожие вопросы