Script untuk Menghapus Antrian Spam pada Zimbra Mail Server (Updated)
Saya pernah menulis script untuk menghapus antrian spam dari mail server Zimbra di tahun 2011, untuk artikelnya bisa dibaca disini :Ā Script untuk Menghapus Antrian Spam pada Zimbra Mail Server. Script tersebut menjadi salah satu script wajib yang dipasang pada server-server klien Excellent jika terjadi spamming karena adanya account user yangĀ compromised.
Setelah versi 8.7, ada sedikit perubahan posisi file executable Postfix. Zimbra mengubah posisi folder dari yang awalnya ditempatkan pada folderĀ /opt/zimbra/postfix/sbin menjadi folderĀ /opt/zimbra/common/sbin. Akibatnya, saya harus mengubah manual script tersebut untuk bisa digunakan pada server Zimbra versi 8.7 keatas.
Daripada repot tiap kali mengubah script, pagi ini saya menyempatkan diri mengubah scriptnya agar lebih fleksibel dan bisa dipakai baik pada Zimbra 8.7 keatas maupun Zimbra 8.6 dan versi dibawahnya.
Saya sempat terkendala melakukan modifikasi script karena script ini ditulis pakai bahasa pemrogramman Perl sedangkan saya biasanya menggunakan bash. Setelah beberapa kali mencari referensi di Google, akhirnya script ini jadi bisa digunakan.
Berikut adalah isi scriptnya :
[code lang=”bash”]
#!/usr/bin/perl -w
#
# pfdel – deletes message containing specified address from
# Postfix queue. Matches either sender or recipient address.
#
# Usage: pfdel
#
use strict;
my $LISTQ;
my $POSTSUPER;
# Change these paths if necessary.
system(“su – zimbra -c ‘zmcontrol -v’ > /tmp/zcs-ver.txt”);
my $VER=`awk ‘/Release 6|Release 7|Release 8.0|Release 8.5|Release 8.6/’ /tmp/zcs-ver.txt`;
#print $VER
if (length($VER) > 0)
{
$LISTQ = “/opt/zimbra/postfix/sbin/postqueue -p”;
$POSTSUPER = “/opt/zimbra/postfix/sbin/postsuper”;
}
else
{
$LISTQ = “/opt/zimbra/common/sbin/postqueue -p”;
$POSTSUPER = “/opt/zimbra/common/sbin/postsuper”;
}
my $email_addr = “”;
my $qid = “”;
my $euid = $>;
if ( @ARGV != 1 ) {
die “Usage: pfdel \n”;
} else {
$email_addr = $ARGV[0];
}
if ( $euid != 0 ) {
die “You must be root to delete queue files.\n”;
}
open(QUEUE, “$LISTQ |”) ||
die “Can’t get pipe to $LISTQ: $!\n”;
my $entry = ; # skip single header line
$/ = “”; # Rest of queue entries print on
# multiple lines.
while ( $entry = ) {
if ( $entry =~ / $email_addr$/m ) {
($qid) = split(/\s+/, $entry, 2);
$qid =~ s/[\*\!]//;
next unless ($qid);
#
# Execute postsuper -d with the queue id.
# postsuper provides feedback when it deletes
# messages. Let its output go through.
#
if ( system($POSTSUPER, “-d”, $qid) != 0 ) {
# If postsuper has a problem, bail.
die “Error executing $POSTSUPER: error ” .
“code ” . ($?/256) . “\n”;
}
}
}
close(QUEUE);
if (! $qid ) {
die “No messages with the address <$email_addr> ” .
“found in queue.\n”;
}
exit 0;
[/code]
Jika malas melakukan copy-paste manual, script ini bisa didownload langsung dengan perintah :
[code lang=”bash”]
wget https://www.vavai.com/pfdel
chmod +x pfdel
[/code]
Dan untuk menjalankannya, cukup menjalankan script ini dengan hak akses root dengan perintah :
[code lang=”bash”]
./pfdel alamat-email-spammer
[/code]
Contoh :
[code lang=”bash”]
./pfdel spammersampah@vavai.com
[/code]
Semoga bermanfaat bagi rekan-rekan yang memerlukannya.
Hi Mas Vavai,
Saya coba copas pfdel-nya dan di taruh di bin, tapi dapat error seperti ini
syntax error at /usr/bin/pfdel line 49, near “= ;”
syntax error at /usr/bin/pfdel line 52, near “= ) ”
syntax error at /usr/bin/pfdel line 68, near “}”
Execution of /usr/bin/pfdel aborted due to compilation errors.
apakah $entry= itu harus diisi kah?