How Can We Help?

Script untuk Menghapus Email SPAM di Queue Zimbra Mail Server

You are here:

Jika kita mengelola email server, bukan sekali dua email server yang kita kelola mendapat serangan spam. Jika serangan itu cukup parah, kemungkinan ada banyak email deferred yang memenuhi 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.

Untuk mengatasinya bisa menggunakan script berikut, yang saya 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"

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";

Script Selengkapnya :

#!/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;