postfix队列引起的不能发送邮件

2012年4月27日 发表评论 阅读评论

公司的邮件服务器出问题了。直接telnet mail.XXX.com 25和telnet mail.XXX.com 110都能正常收到postfix和dovecot的正常回显。查看服务的话,也发现状态正常。重启两个服务,发现问题依旧。刚开始怀疑是policyd策略的问题 。后来进mysql数据里看了半天,也没看到什么不对的地方。后来直接把策略进程给关掉。通过mail命令向外发送,发现也不能发出去。

折腾了大概有十多分钟还没找到原因,开始有点慌了。后来想到sendmail搭建时的邮件队列问题。由是到网上查了下关于postfix邮件队列的说明。这一查,大吃了一惊。竟然有一个有的邮件占了好几万封。原来是开发的该仁兄写的一段关于邮件通知的代码写的有问题,导致其用公司的邮件系统不停的向他的163邮箱发送邮件。而163将其地址列为了垃圾地址。导致发送拒绝后,一直在队列里排了N多封。

查到原因就好办多了,利用postfix的队列删除命令,将其删掉就行了。其中涉及到的几个命令在此总结下:

postqueue -p mailq查看队列邮件, postfix支持传统的mailq命令,同时也有自己的 队列维护命令postqueue。

使用postsuper 来维护队列。一般是先用mailq查看队列里的邮件,找到对应的id,然后用postsuper -d来删除。例如id0EAF3A9B 那么postsuper -d 0EAF3A9B  , postsuper -d ALL  这样就删除所有邮件啦。

删除所有发件人为test@361way.com 的队列:

 mailq |awk 'BEGIN { RS = "" } / test@361way.com$/ { print $1 }' | tr -d '*!' |postsuper -d –

在使用过程中,发现上面的脚本有时并不好使,而且太复杂,容易忘,我就精简了下,可以使用下面这个!

mailq|grep test@361way|awk '{ print $1 }'|postsuper -d -

修复队列以及任何权限错误

postfix check

查看邮件系统日志

tail -f /var/log/maillog

 

 启动postfix        postfix start

停止postfix        postfix stop

重新读取postfix配置文件     postfix reload

立即投递队列中所有邮件(慎用)           postfix flush

发送邮件放置目录:/var/spool/postfix

 

Postfix 邮件队列管理的几个 Perl 小程序,pfdel.pl 是用来删除队列中指定用户的邮件的,luserdel.pl 是用来删除队列中无效用户的邮件的,moqdel.pl 是用来删除队列中邮箱配额已满的用户的邮件的,jmoqdel.pl 是删除邮箱配额已满的用户的垃圾邮件箱的。

平时主要用的为pddel.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&#39;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;

 

 

 




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

分类: Linux/unix/mac 标签:
  1. 本文目前尚无任何评论.