Jika kita mengelola email server, bukan sekali dua email server yang kita kelola mendapat serangan spam. Jika serangan itu cukup parah, kemungkinan akan terdapat banyak email deferred yang memenuhi email queue. Email-email itu merupakan email sampah, namun kita tidak bisa langsung menghapus seluruh email sampah tersebut dari deferred queue karena ada kemungkinan bercampur dengan email normal.
Overview Script #
Untuk mengatasinya bisa menggunakan script berikut, yang kami dapatkan dari blog ini. Caranya, salin script dibawah ini kedalam file teks, simpan dengan nama pfdel, kemudian set permissionnya (chmod 755 pfdel, chmod +x pfdel)
. Untuk menjalankannya bisa menggunakan perintah:
pfdel email-address-spammer //contoh: pfdel spam@spammer.org
Catatan: Script ini digunakan untuk Zimbra Mail Server dan dijalankan dalam modus akses root. Untuk mengakses mail queue dalam modus root, gunakan perintah ini :
su - zimbra -c "mailq"
Modifiksi Script untuk Postfix #
Jika digunakan pada mail server berbasis Postfix non Zimbra, ganti baris berikut:
my $LISTQ = "/opt/zimbra/postfix/sbin/postqueue -p"; my $POSTSUPER = "/opt/zimbra/postfix/sbin/postsuper";
Menjadi
my $LISTQ = "/usr/sbin/postqueue -p"; my $POSTSUPER = "/usr/sbin/postsuper";
Detail Script #
Berikut detail script lengkap yang bisa anda salin dan gunakan.
#!/usr/bin/perl -w # # pfdel - deletes message containing specified address from # Postfix queue. Matches either sender or recipient address. # # Usage: pfdel <email_address> # use strict; # Change these paths if necessary. my $LISTQ = "/opt/zimbra/postfix/sbin/postqueue -p"; my $POSTSUPER = "/opt/zimbra/postfix/sbin/postsuper"; my $email_addr = ""; my $qid = ""; my $euid = $>; if ( @ARGV != 1 ) { die "Usage: pfdel <email_address>\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 = <QUEUE>; # skip single header line $/ = ""; # Rest of queue entries print on # multiple lines. while ( $entry = <QUEUE> ) { 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;