1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
sub Parse
{
$first_header_part = 1;
my ($msgbufp, $msgbufp1);
for ($msgbufp = 0; $msgbufp <= $pmax; ) {
$msgbufp1 = index($MessageBuffer, "\n", $msgbufp);
last if $msgbufp1 < 0;
$_ = substr($MessageBuffer, $msgbufp, $msgbufp1 - $msgbufp);
$msgbufp = $msgbufp1 + 1;
if ($MTA eq 'exim' || $MTA eq 'qmail') {
/^\s*(\S+\@\S+):\s*$/ && ($CurAddr = $1);
$CurAddr =~ s/[\<\>]//g;
$CurAddr =~ s/\s*//g;
&Debug("CurAddr => $CurAddr") if $debug && $CurAddr;
}
### unknown MTA ###
if (/(\S+\@[-A-Z0-9\.]+)/i) {
/(\S+\@[-A-Z0-9\.]+)/i && ($P_CurAddr = $1); # pseudo
$P_CurAddr =~ s/[\<\>]//g;
$P_CurAddr =~ s/\s*//g;
&Debug("P_CurAddr => $P_CurAddr") if $debug && $P_CurAddr;
}
##### TRAP CODE #####
if (/fatal error/i) { $fatal++;}
if (/\@/ && /(5\d\d)/) { &AnalyzeErrorCode($_); $found++; }
if (/\@/ && /$TrapWord/i) { &AnalyzeErrorWord($_); $found++; }
### unknown MTA
# e.g. uset not known
if (/$TrapWord/i && $P_CurAddr) {
&AnalyzeErrorWord($_, $P_CurAddr);
$found++;
}
# EXIM pattern
if (/failed/i && $MTA eq 'exim') {
$trap_want_addr = $_;
next;
}
if ($trap_want_addr && /\@/ && $MTA eq 'exim') {
local($a);
/^\s*(\S+\@\S+)/ && ($a = $1);
$a =~ s/[\<\>:]//g;
&CacheOn($a, " ") if $a; # space is a dummy
undef $trap_want_addr;
}
if (/($ErrorCodePat)/ && $MTA eq 'exim') {
&AnalyzeErrorWord($_, $CurAddr);
$found++;
}
### sendmail
if ($fatal) {
local($a);
/^\s*(\S+\@\S+)/ && ($a = $1);
$a =~ s/[\<\>]//g;
&CacheOn($a, " ") if $a; # space is a dummy
}
# end of fatal block
if ($fatal && /^$/) {
undef $fatal;
}
}
# VERPs: qmail specific
# Suppose list-admin-account=domain@$mydomain syntax, ...
{
local($ra, $addr);
$addr = $ENV{'RECIPIENT'};
$ra = $ENV{'RECIPIENT'};
if ($addr =~ /=/) {
$addr =~ s/\@\S+$//;
$addr =~ s/=/\@/;
$addr =~ s/^\S+\-admin\-//; # fml specific
$ra =~ s/admin\-\S+\@/admin@/;
&Debug("qmail:". $addr);
&Debug("qmail return_addr:". $ra);
$return_addr{$ra} = 1;
&CacheOn($addr, " ");
}
}
}
|