首页 > 解决方案 > 提取电子邮件地址 Perl 脚本

问题描述

我的mail.log文件中有以下几行我想提取域并在txt文件中生成输出,并REJECT在域和REJECT.

Dec 30 07:34:09 mx postfix/smtpd[23855]: NOQUEUE: reject: RCPT from unknown[120.33.244.87]: 450 4.7.1 Client host rejected: cannot find your hostname, [120.33.244.87]; from=<hcsales6@printingpress.xicp.net> to=`<`nishant@mydomain.com> proto=SMTP helo=<printingpress.xicp.net> 

输出应该是这样的

printingpress.xicp.net REJECT

我已经尝试过这段代码,但这给了我带有 REJECT 的 IP 地址,我想提取域名

 perl -ne 'print "$1\n" if /NOQUEUE:.*?\[(\d+?\.\d+?\.\d+?\.\d+?)\]/' /var/log/mail.log 

这是最终的结果和工作场景,我有运行 policy-spf 和 DKIM 的 postfix 服务器,但收到了许多垃圾邮件连接,并且我的 postfix 很好地拒绝了请求。我想使用 smtpd_sender_restrictions 阻止这些垃圾邮件发送者,但是过滤被拒绝的主机非常耗时并且需要自动化。

感谢@Polar Bear 的解决方案。现在系统是这样工作的

后缀 main.cf

 smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/blacklist

黑名单.sh

 #!/bin/bash
 perl -ne 'print "$1 REJECT\n" if /NOQUEUE:\s+reject:.*?from=<\w+@(.*?)>/' /var/log/mail.log | sort | uniq >> /etc/postfix/blacklist
 postmap /etc/postfix/blacklist
 service postfix restart

授予文件权限

 chmod 755 blacklist.sh

每天晚上为 blacklist.sh 运行 cronjob。

我尝试了相同的代码,只进行了少量修改,并且每 3 小时运行一次 cronjob 以获取 SASL 登录失败和阻塞 IP 地址。

标签: bashperl

解决方案


一个班轮

在 Windows 10 中(草莓 Perl)

perl -ne "print \"$1 REJECT\n\" if $_ =~ /NOQUEUE:\s+reject:.*?helo=<(.*)>/" /var/log/mail.log

在 Debian 8 [perl (v5.20.2)]

perl -ne 'print "$1 REJECT\n" if /NOQUEUE:\s+reject:.*?helo=<(.*)>/' /var/log/mail.log

OP 通知应取自字段每个域有一条记录,然后应按以下形式更改命令

perl -ne 'print "$1 REJECT\n" if /NOQUEUE:\s+reject:.*?from=<\w+@(.*?)>/' /var/log/mail.log | sort | uniq

或扩展代码版本

use strict;
use warnings;

use Data::Dumper;

my $debug = 1;

my %hash;

my $pattern = qr/(\w+\s+\d+)\s+([\d:]+).*?:\s+NOQUEUE:\s+(\w+):.*?\[([\d.]+)\]:\s+(\d+).*?:\s+(.*?),.*?from=<(.*?)>\s+to=<(.*?)>.*?helo=<(.*)>/;

my @fields = qw/date time state ip code err_msg from to fqdn/;

my $line = <DATA>;
chomp($line);

@hash{@fields} = ($line =~ /$pattern/);

print $hash{fqdn}. ' '. uc $hash{state} . "\n";

print Dumper(\%hash) if $debug;

__DATA__
Dec 30 07:34:09 mx postfix/smtpd[23855]: NOQUEUE: reject: RCPT from unknown[120.33.244.87]: 450 4.7.1 Client host rejected: cannot find your hostname, [120.33.244.87]; from=<hcsales6@printingpress.xicp.net> to=<nishant@mydomain.com> proto=SMTP helo=<printingpress.xicp.net>

输出

printingpress.xicp.net REJECT
$VAR1 = {
          'state' => 'reject',
          'from' => 'hcsales6@printingpress.xicp.net',
          'time' => '07:34:09',
          'code' => '450',
          'ip' => '120.33.244.87',
          'to' => 'nishant@mydomain.com',
          'date' => 'Dec 30',
          'err_msg' => 'cannot find your hostname',
          'fqdn' => 'printingpress.xicp.net'
        };

推荐阅读