我正在尝试在 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 的设置过程是:
- 安装MIMEDefang:
apt install mimedefang
- 在
/etc/default/mimedefang
集合中(如果需要,请使用其他端口):SOCKET=inet:33333
- 添加
/etc/postfic/main.cf
:smtpd_milters = inet:localhost:33333 milter_default_action = accept
- 复制
/etc/mimedefang-filter
到/etc/mail/mimedefang-filter
,并根据您的需要进行修改(不需要使其可执行)。 - 重新加载 Postfix 和 MIMEDefang 服务:
sudo systemctl reload postfix mimedefang
每次更改时都必须重新加载 MIMEDefang mimedefang-filter
。
顺便说一下,这个演示让我们对MIMEDefang有一个很好的理解:https://www.mimedefang.org/static/mimedefang-lisa04.pdf
正在运行的实际 Perl 脚本位于/usr/bin/mimedefang.pl
then 包含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
以确保一切正常运行。