如何在 Debian 上安装 MIMEDefang?

如何在 Debian 上安装 MIMEDefang?

我正在尝试在 Debian Stretch 上安装 MIMEDefang,但它无法立即运行,而且我找不到任何可用的指南。

apt install mimedefang我添加以下内容后/etc/postfix/main.cf

smtpd_milters = unix:/var/spool/MIMEDefang/mimedefang.sock
milter_default_action = accept

重新加载后缀,并service mimedefang status说它是积极的跑步

甚至尝试复制/etc/mimedefang-filter/etc/mail/mimedefang-filter使其可执行......

但我仍然只是得到这个/var/log/mail.log

postfix/smtpd[29832]: warning: connect to Milter service unix:/var/spool/MIMEDefang/mimedefang.sock: No such file or directory

该文件/var/spool/MIMEDefang/mimedefang.sock虽然存在。

sendmail之前已经安装了。

我如何安装并激活这个东西?

答案1

在 MIMEDefang 邮件列表上的 Benoît Panizzon 的帮助下,我发现我需要使用inet而不是unix作为监听套接字,以便它监听指定本地或远程主机上的 TCP 端口。所以 Debian/Ubuntu 上 MIMEDefang 的设置过程是:

  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.plthen 包含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以确保一切正常运行。

相关内容