Mail-Abuse
view release on metacpan or search on metacpan
lib/Mail/Abuse/Incident/Normalize.pm view on Meta::CPAN
return;
}
my $text;
$rep->header($e->head);
$rep->body(\$text);
my $decoded_body = ($self->decode_parts($rep, 'any', $e) || '');
$rep->body(\$decoded_body) if $decoded_body;
$rep->normalized(ref $self);
$self->html_parser(undef);
$parser->filer->purge;
return unless $rep->body and $ {$rep->body};
# Phase 2 - This might be actually a
# reply of forward. Remove any
# indications from the message body
$ {$rep->body} =~ s/
^(([\t ]|[^\w\s])* # 0 or more non-space, non-word chars
[^\w\s]+ # followed by one or more non-space, non-words
)+ # repeated one or more times,
[\t ]* # followed by zero or more spaces.
//xmsg;
# Phase 3 - Try to recognize a
# timezone in the body. If this fails,
# try at the Date: header. Finally,
# use UTC as the guess
# These timezones were taken w/o permission from Time::Zone.
# Thanks to the authors anyway :)
my %Zones =
(
"GMT" => '+0000', # Greenwich Mean
"UT" => '+0000', # Universal (Coordinated)
"UTC" => '+0000',
"WET" => '+0000', # Western European
"WAT" => '-0100', # West Africa
"AT" => '-0200', # Azores
"FNT" => '-0200', # Brazil Time (Extreme East)
"BRT" => '-0300', # Brazil Time (East Standard)
"MNT" => '-0400', # Brazil Time (West Standard)
"EWT" => '-0400', # U.S. Eastern War Time
"AST" => '-0400', # Atlantic Standard
"VET" => '-0400', # Venezuela Standard Time
"EST" => '-0500', # Eastern Standard
"ACT" => '-0500', # Brazil Time (Extreme West - Acre)
"CST" => '-0600', # Central Standard
"MST" => '-0700', # Mountain Standard
"PST" => '-0800', # Pacific Standard
"YST" => '-0900', # Yukon Standard
"HST" => '-1000', # Hawaii Standard
"CAT" => '-1000', # Central Alaska
"AHST" => '-1000', # Alaska-Hawaii Standard
"NT" => '-1100', # Nome
"IDLW" => '-1200', # International Date Line West
"CET" => '+0100', # Central European
"MEZ" => '+0100', # Central European (German)
"ECT" => '+0100', # Central European (French)
"MET" => '+0100', # Middle European
"MEWT" => '+0100', # Middle European Winter
"SWT" => '+0100', # Swedish Winter
"SET" => '+0100', # Seychelles
"FWT" => '+0100', # French Winter
"EET" => '+0200', # Eastern Europe, USSR Zone 1
"UKR" => '+0200', # Ukraine
"BT" => '+0300', # Baghdad, USSR Zone 2
"IT" => '+0330', # Iran
"ZP4" => '+0400', # USSR Zone 3
"ZP5" => '+0500', # USSR Zone 4
"IST" => '+0530', # Indian Standard
"ZP6" => '+0600', # USSR Zone 5
"WST" => '+0800', # West Australian Standard
"HKT" => '+0800', # Hong Kong
"CCT" => '+0800', # China Coast, USSR Zone 7
"JST" => '+0900', # Japan Standard, USSR Zone 8
"KST" => '+0900', # Korean Standard
"CAST" => '+0930', # Central Australian Standard
"EAST" => '+1000', # Eastern Australian Standard
"GST" => '+1000', # Guam Standard, USSR Zone 9
"NZT" => '+1200', # New Zealand
"NZST" => '+1200', # New Zealand Standard
"IDLE" => '+1200', # International Date Line East
);
# In the following matches, we'll attempt to use the inverted
# message to avoid mistaking a timezone in a forwarded header for
# our target timestamp...
my $rev = join "\n", reverse split /\n/, $ {$rep->body};
# Step 3a - Try to locate a numeric
# timezone in the format [+-]\d\d:?\d\d
# warn "Body: ${$rep->body}\n*********************\n";
# warn "Rev: $rev\n******************\n";
if ($rev =~ m!([-+]\d\d:?\d\d)!ms)
{
$rep->tz($1);
}
# Step 3b - If failed, try to locate the
# longest timezone posssible
unless ($rep->tz)
{
my $zone = '';
for my $tz ( sort keys %Zones )
{
next if length($tz) < length($zone);
next unless ($rev =~ m/\W ${tz} \W /msx
or $rev =~ m/^ ${tz} \W /msx
or $rev =~ m/\W ${tz} $ /msx
or $rev =~ m/^ ${tz} $ /msx);
# warn "*** Zone $tz matched\n";
( run in 1.684 second using v1.01-cache-2.11-cpan-39bf76dae61 )