`

Postfix 邮件队列管理的几个 Perl 小程序

阅读更多

最近管理邮件系统时发现几个问题,一个是有些用户设置了转发,但是转发地址有问题,经常因为退信而塞爆 邮箱(有邮箱限额),之后的邮件都会被塞到等待队列里。还有就是有许多寄到本地虚拟域的信没有对应的用户,按说 Postfix 应该不会投递这类邮件,但是实际情况是它交给 maildrop 投递,而 maildrop 发现没有该用户,报告指定用户非法,这时正确的动作应该是退信,不过可能是我用的版本太低,maildrop 没有退信,而是把它放到等待队列里等待下次再试。这样等待队列里经常会有大量的这种邮件。所以,要想办法把这些邮件都清除掉。

在《Postfix 权威指南》里有一个叫 pfdel 的 Perl 小程序,可以用它删除指定邮件地址的邮件(不管是发信人还是收信人的邮件地址),这个虽然方便,但是如果想要清除因为 maildir over quota 或者 Invalid user specified 错误而产生的邮件,还需要修改一下。下面是这四个程序:


  • pfdel.pl
  • luserdel.pl
  • moqdel.pl
  • jmoqdel.pl

 

其中,pfdel.pl 是用来删除队列中指定用户的邮件的,luserdel.pl 是用来删除队列中无效用户的邮件的,moqdel.pl 是用来删除队列中邮箱配额已满的用户的邮件的,jmoqdel.pl 是删除邮箱配额已满的用户的垃圾邮件箱的。

我现在把 luserdel.pl 放到 crontab 里,每天晚上清理一次,终于可以高枕无忧了。

pfdel.pl
#!/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 = "/usr/sbin/postqueue -p";
my $POSTSUPER = "/usr/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";
}
 

luserdel.pl

#!/usr/bin/perl -w
#
# luserdel - deletes message containing invalid user from
# Postfix queue.
#
# Usage: luserdel
#
 
use strict;
 
# Change these paths if necessary.
my $LISTQ = "/usr/sbin/postqueue -p";
my $POSTSUPER = "/usr/sbin/postsuper";
 
my $qid = "";
my $euid = $>;
 
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 =~ /Invalid user specified/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 invalid user messages found in queue.\n";
}
 
exit 0;

moqdel.pl
#!/usr/bin/perl -w
#
# moqdel - deletes message containing maildir over quota from
# Postfix queue.
#
# Usage: moqdel
#
 
use strict;
 
# Change these paths if necessary.
my $LISTQ = "/usr/sbin/postqueue -p";
my $POSTSUPER = "/usr/sbin/postsuper";
 
my $qid = "";
my $euid = $>;
 
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 =~ /maildir over quota/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 maildir over quota messages found in queue.\n";
}
 
exit 0;

jmoqdel.pl

#!/usr/bin/perl -w
#
# jmoqdel - deletes Junk directories whose maildir over quota from
# Postfix queue.
#
# Usage: jmoqdel
#
 
use strict;
 
my $HOME_BASE = "/var/vmail";
# Change these paths if necessary.
my $LISTQ = "/usr/sbin/postqueue -p";
my $POSTSUPER = "/usr/sbin/postsuper";
 
my $user = "";
my $domain = "";
my $email = "";
my $euid = $>;
 
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 =~ /maildir over quota/m ) {
                ($user,$domain,$email) = split(/\n/, $entry, 3);
                ($user,$domain) = ($email =~ m!\s*(.+)@(.+)\s*!);
                `rm $HOME_BASE/$domain/$user/Maildir/.Junk -rf &> /dev/null`;
                next unless ($email);
        }
}
close(QUEUE);
 
if (! $email ) {
        die "No maildir over quota messages found in queue.\n";
}

分享到:
评论

相关推荐

    Linux下Postfix邮件服务器搭建

    在 Linux 下成功搭建起 Postfix 服务器需要完成以下几个步骤:安装 Postfix、配置 main.cf 文件、添加 DNS 服务器和测试 Postfix。 一、安装 Postfix 首先,需要卸载 sendmail 相关的所有服务,执行以下命令:sudo...

    Linux系列-Red_Hat5平台下的Postfix邮件服务搭建

    程序文件位于/usr/libexec/postfix,邮件队列文件位于/var/spool/postfix,而管理工具位于/usr/sbin/,如Postalias、Postconf、Postfix、Postmap、Postqueue和Postsuper,它们分别用于管理别名表、配置文件、服务启...

    postfix邮件系统原理

    postfix邮件系统原理postfix邮件系统原理postfix邮件系统原理

    postfix邮件服务器软件

    6. **队列管理器**(qmgr):管理邮件队列,确保邮件按顺序处理并避免拥塞。 在安全方面,Postfix支持多种防止垃圾邮件和欺诈邮件的技术,如SPF(Sender Policy Framework)、DKIM(DomainKeys Identified Mail)和...

    树莓派安装postfix邮件服务1

    Squirrelmail则是一款基于Web的邮件客户端,可以让你通过浏览器访问和管理邮件。它提供了一个直观的界面,用户可以在任何有网络连接的地方登录并读写邮件。为了提高安全性,使用HTTPS连接来访问Webmail是非常推荐的...

    Postfix邮件服务器搭建

    在本文中,我们将深入探讨如何搭建一个基于Postfix的邮件服务器,并结合Cyrus-IMAP、Cyrus-SASL、MySQL以及IMP等组件,构建一个完整的邮件系统。Postfix是一个广泛使用的开源邮件传输代理,它以其稳定性和高效性而...

    postfix邮件

    首先,安装Postfix邮件服务器通常可以通过包管理器如`yum`进行,命令为`yum -y install postfix*`。安装完成后,需要配置Postfix以适应你的网络环境,这包括设置主机名和域名,并配置邮件路由。然后,通过`service ...

    postfix邮件服务器的部署

    2. **Apache安装配置**:Apache可能是为了提供Webmail服务,如Webmin,用来远程管理邮件服务器。 3. **MySQL安装配置**:MySQL用于存储用户认证信息和其他数据库需求。 4. **courier-authlib安装配置**:提供身份...

    postfix邮件服务器配置详解与错误解析

    ### Postfix邮件服务器配置详解与错误解析 #### 一、所需软件 为了搭建Postfix邮件服务器,我们需要准备一系列软件,并确保它们能够协同工作。以下是所需的软件列表及其在邮件服务器中的作用: 1. **CentOS 5.6**...

    Postfix 邮件服务器

    接下来,设置PHPMyadmin来管理邮件用户的数据库。安装PHPMyadmin后,创建一个新的数据库,用于存储邮件用户信息。Postfix本身并不存储用户密码,而是依赖于外部认证机制,如 Cyrus SASL 或 MySQL。若使用MySQL,需要...

    Postfix邮件书籍

    在管理方面,Postfix提供了丰富的命令行工具,如`postconf`用于查看和修改配置,`postfix start/stop/restart`用于控制服务状态,`postqueue`和`postfix flush`则帮助我们查看和管理邮件队列。了解这些工具的使用是...

    postfix搭建邮件系统

    **amavisd-new** 是一个接口程序,它连接了Postfix、ClamAV和SpamAssassin,提供了一种高效的方式在邮件传递过程中执行这些安全检查。 **安装步骤:** 1. 更新系统并安装基础软件包。 2. 安装Apache、MySQL、PHP,...

    postfix post 邮件系统

    标签中的"post"可能是指Postfix的命令行工具,如postconf用于查看或修改Postfix配置,postqueue用于查看邮件队列,postdrop用于创建新的邮件,等等。这些工具帮助管理员管理Postfix的运行状态。 在实际应用中,...

    基于Postfix邮件系统

    - **IMAP协议(Internet Message Access Protocol)**: IMAP是一种比POP3更先进的邮件接收协议,它允许用户在服务器上管理邮件而不仅仅是下载它们。IMAP使用TCP端口143。 - **DNS协议(Domain Name System)**: DNS...

    Linux下postfix邮件服务器搭建

    6. `squirrelmail-1.4.13.tar.bz2`:Web界面邮件管理程序,用户可以通过浏览器查看和管理邮件。 7. `extman-1.1.tar.gz` 和 `extmail-1.2.tar.gz`:邮件后台管理程序,用于系统管理员对邮件服务器进行管理和监控。 8...

    postfix邮件安装配置文档

    5. **Postfix (2.6.5)** - 邮件服务器主程序。 - 下载地址: [Postfix](http://down1.chinaunix.net/distfiles/postfix-2.6.5.tar.gz) 6. **Courier Authlib (0.62.4)** - 与Cyrus SASL一起进行身份验证。 - 下载...

    postfix安装及管理--入门

    Postfix 是一款开源的邮件传输代理(MTA),被广泛用于搭建邮件服务器,提供电子邮件的发送和接收功能。本文档将介绍如何从零开始安装和配置 Postfix 邮件系统,适合初学者入门。 首先,为了邮件系统的正常运行,...

    postfix 权威指南

    队列管理 qmgr的运行原理 队列管理工具 第六章 E-mail与DNS DNS概论 决定邮件路由 Postfix与DNS 常见问题 第七章 本地投递与 POP/IMAP Postfix的投递代理程序 邮箱格式 本地邮件的投递操作 POP与IMAP 本地邮件传输...

Global site tag (gtag.js) - Google Analytics