| Server IP : 216.92.14.13 / Your IP : 216.73.216.171 Web Server : Apache System : Linux vps4089.pairvps.com 5.15.0-190-generic #200-Ubuntu SMP Fri Aug 7 15:06:04 UTC 2026 x86_64 User : rmlac2fmr ( 1040637) PHP Version : 8.2.32 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /etc/mailmunge/ |
Upload File : |
#!/usr/bin/env perl
use strict;
use warnings;
# DO NOT USE THIS FILTER AS-IS.
# MODIFY IT FOR YOUR DESIRED POLICY
package Mailmunge::Filter::Example;
use base qw(Mailmunge::Filter::Compat);
use Mailmunge::Response;
use Mailmunge::Test::SpamAssassin;
use File::VirusScan;
sub filter_begin
{
my ($self, $ctx) = @_;
# Scan for viruses using Clamd
my $scanner = File::VirusScan->new({
engines => {'-Daemon::ClamAV::Clamd' => {
socket_name => '/var/run/clamav/clamd.ctl'}
}});
my $result_set = $scanner->scan($self->inputmsg_absolute($ctx));
my @contents = $result_set->contents();
my $result = $contents[0];
if ($result->is_error()) {
return Mailmunge::Response->TEMPFAIL(message => 'Error running virus-scanner: ' . $result->get_data());
} elsif ($result->is_virus()) {
return Mailmunge::Response->REJECT(message => 'Found virus: ' . $result->get_data());
}
return Mailmunge::Response->CONTINUE();
}
sub filter
{
my ($self, $ctx, $part, $fname, $extension, $mime_type) = @_;
# MIME type message/partial is a security hazard
if (lc($mime_type) eq 'message/partial') {
return Mailmunge::Response->REJECT(message => 'We do not accept messages of type message/partial');
}
# Do not allow:
# - CLSIDs {foobarbaz}
# - bad extensions (possibly with trailing dots) at end
my $bad_exts = '(ade|adp|app|asd|asf|asx|bas|bat|chm|cmd|com|cpl|crt|dll|exe|fxp|hlp|hta|hto|inf|ini|ins|isp|jse?|lib|lnk|mdb|mde|msc|msi|msp|mst|ocx|pcd|pif|prg|reg|scr|sct|sh|shb|shs|sys|url|vb|vbe|vbs|vcs|vxd|wmd|wms|wmz|wsc|wsf|wsh|\{[^\}]+\})';
my $re = '\.' . $bad_exts . '\.*$';
if ($extension =~ /$re/i) {
return Mailmunge::Response->REJECT(message => "We do not accept attachments called '$fname'");
}
return Mailmunge::Response->CONTINUE();
}
sub filter_end
{
my ($self, $ctx) = @_;
# Tag messages scoring >= 5.0 with SpamAssassin
# with '[Spam]'
my $sa = Mailmunge::Test::SpamAssassin->new($self);
my $status = $sa->spam_assassin_status($ctx, 1);
if ($status) {
$self->action_add_header($ctx, 'X-Spam-Result', 'score=' . $status->get_score() . '; tests=' . $status->get_names_of_tests_hit());
if ($status->get_score() >= 5.0) {
$self->action_change_header($ctx, 'Subject', '[Spam] ' . $ctx->subject);
$self->action_change_header($ctx, 'X-Spam-Status', 'Yes');
} else {
$self->action_delete_all_headers($ctx, 'X-Spam-Status');
}
$status->finish();
}
return Mailmunge::Response->CONTINUE();
}
my $filter = Mailmunge::Filter::Example->new();
$filter->run();
1;