I recieved the following patch to MHonArc after offering a small
bounty at the Free Software Bazaar. Overall, I got two offers to do
the patch within a week of the offer being posted. I'm impressed. This
patch was written by Alexis Mikhailov.
Jeff
------------------------
Alexis Mikhailov <root(_at_)medinf(_dot_)chuvashia(_dot_)su> writes:
Hello Jeff!
Here is a patch against version 2.3.3 of MHonArc. I've checked it to some
extent.
Alexis
diff -ru MHonArc2.3.3/lib/mhamain.pl MH/lib/mhamain.pl
--- MHonArc2.3.3/lib/mhamain.pl Sun Nov 8 21:06:23 1998
+++ MH/lib/mhamain.pl Fri Jun 11 17:18:44 1999
@@ -238,7 +238,8 @@
## Get here, we are processing mail folders
- local($mesg, $tmp, $index, $sub, $from, $i, $date, $fh);
+ local($mesg, $tmp, $index, $sub, $from, $i, $date, $fh ,$fromaddrname,
+ $fromaddrdomain);
local(%fields);
$i = $NumOfMsgs;
@@ -255,7 +256,7 @@
$handle = $ADD;
## Read mail head
- ($index,$from,$date,$sub,$header) =
+ ($index,$from,$date,$sub,$header,$fromaddrname,$fromaddrdomain) =
&read_mail_header($handle, *mesg, *fields);
if ($index ne '') {
@@ -303,7 +304,7 @@
}
print STDOUT "." unless $QUIET;
$mesg = '';
- ($index,$from,$date,$sub,$header) =
+
($index,$from,$date,$sub,$header,$fromaddrname,$fromaddrdomain) =
&read_mail_header($fh, *mesg, *fields);
# Process message if valid
@@ -347,7 +348,7 @@
MBOX: while (!eof($fh)) {
print STDOUT "." unless $QUIET;
$mesg = '';
- ($index,$from,$date,$sub,$header) =
+
($index,$from,$date,$sub,$header,$fromaddrname,$fromaddrdomain) =
&read_mail_header($fh, *mesg, *fields);
if ($index ne '') {
@@ -667,6 +668,23 @@
print STDOUT "\n" unless $QUIET;
}
+sub split_address {
+ local($from) = @_;
+ local($fromaddrname, $fromaddrdomain);
+ local(@machines);
+
+ $from =~ s/^.*\<(.*)\>.*$/$1/;
+ $from =~ s/\(.*\)//;
+ $from =~ s/^\s+//;
+ $from =~ s/\s+$//;
+
+ @machines = split /\!/, $from;
+ if ($machines[-1] =~ /[(_at_)%]/)
+ {
+ return split /[(_at_)%]/, $machines[-1];
+ }
+ return ($machines[-1], $machines[-2]);
+}
##---------------------------------------------------------------------------
## read_mail_header() is responsible for parsing the header of
## a mail message.
@@ -674,7 +692,7 @@
sub read_mail_header {
local($handle, *mesg, *fields) = @_;
my(%l2o, $header, $index, $date, $tmp, @refs, @array);
- local($from, $sub, $msgid);
+ local($from, $sub, $msgid, $fromaddrname, $fromaddrdomain);
local($_);
$header = &readmail::MAILread_file_header($handle, *fields, *l2o);
@@ -759,6 +777,7 @@
foreach (@FromFields) {
next unless $fields{$_};
$from = $fields{$_};
+ ($fromaddrname, $fromaddrdomain) = split_address($from);
last;
}
$from = 'No Author' unless $from;
@@ -802,7 +821,7 @@
&remove_dups(*refs); # Remove duplicate msg-ids
$Refs{$index} = join($X, @refs) if (@refs);
- ($index,$from,$date,$sub,$header);
+ ($index,$from,$date,$sub,$header,$fromaddrname,$fromaddrdomain);
}
##---------------------------------------------------------------------------
diff -ru MHonArc2.3.3/lib/mhrcvars.pl MH/lib/mhrcvars.pl
--- MHonArc2.3.3/lib/mhrcvars.pl Sun Nov 8 21:06:23 1998
+++ MH/lib/mhrcvars.pl Fri Jun 11 17:12:21 1999
@@ -139,13 +139,17 @@
"";
last REPLACESW;
}
- my($cnd1, $cnd2, $cnd3) = (0,0,0);
+ my($cnd1, $cnd2, $cnd3, $cnd4, $cnd5) = (0,0,0,0,0);
if (($cnd1 = ($var eq 'FROM')) || ## Message "From:"
($cnd2 = ($var eq 'FROMADDR')) || ## Message from mail address
- ($cnd3 = ($var eq 'FROMNAME'))) { ## Message from name
+ ($cnd3 = ($var eq 'FROMNAME')) || ## Message from name
+ ($cnd4 = ($var eq 'FROMADDRNAME')) || ## Message from user name
+ ($cnd5 = ($var eq 'FROMADDRDOMAIN'))) { ## Message from domain
my $esub = $cnd1 ? sub { $_[0]; } :
$cnd2 ? \&extract_email_address :
- \&extract_email_name;
+ $cnd3 ? \&extract_email_name :
+ $cnd4 ? \&extract_email_addr_name :
+ \&extract_email_addr_domain;
$canclip = 1; $raw = 1;
($lref, $key, $pos) = compute_msg_pos($index, $var, $arg);
$tmp = defined($key) ? &$esub($From{$key}) : "(nil)";
diff -ru MHonArc2.3.3/lib/mhutil.pl MH/lib/mhutil.pl
--- MHonArc2.3.3/lib/mhutil.pl Sat Oct 3 23:07:54 1998
+++ MH/lib/mhutil.pl Fri Jun 11 17:12:42 1999
@@ -44,6 +44,28 @@
$ret;
}
+sub extract_email_addr_name {
+ local($str) = extract_email_address(shift);
+ local($ret);
+ local(@tmp) = split /\!/, $str;
+ if ($tmp[-1] =~ /[(_at_)%]/)
+ {
+ return (split /[(_at_)%]/, $tmp[-1])[0];
+ }
+ return $tmp[-1];
+}
+
+sub extract_email_addr_domain {
+ local($str) = extract_email_address(shift);
+ local($ret);
+ local(@tmp) = split /\!/, $str;
+ if ($tmp[-1] =~ /[(_at_)%]/)
+ {
+ return (split /[(_at_)%]/, $tmp[-1])[1];
+ }
+ return $tmp[-2];
+}
+
##---------------------------------------------------------------------------
## Get an e-mail name from $str.
##
@@ -386,7 +408,8 @@
}
##---------------------------------------------------------------------------
-## $sub, $msgid, $from come from read_mail_header() (ugly!!!!)
+## $sub, $msgid, $from, $fromaddrname, $fromaddrdomain come from
+## read_mail_header() (ugly!!!!)
##
sub mailUrl {
my($eaddr) = shift;
@@ -394,6 +417,8 @@
my($url) = ($MAILTOURL);
my($to) = (&urlize($eaddr));
my($froml, $msgidl) = (&urlize($from), &urlize($msgid));
+ my($fromaddrnamel, $fromaddrdomainl) = (&urlize($fromaddrname),
+ &urlize($fromaddrdomain));
my($fromaddrl) = (&urlize(&extract_email_address($from)));
my($subjectl);
@@ -404,7 +429,9 @@
$subjectl = &urlize($sub);
}
$url =~ s/\$FROM\$/$froml/g;
- $url =~ s/\$FROMADDR\$/$froml/g;
+ $url =~ s/\$FROMADDRNAME\$/$fromaddrnamel/g;
+ $url =~ s/\$FROMADDRDOMAIN\$/$fromaddrdomainl/g;
+ $url =~ s/\$FROMADDR\$/$fromaddrl/g;
$url =~ s/\$MSGID\$/$msgidl/g;
$url =~ s/\$SUBJECT\$/$subjectl/g;
$url =~ s/\$SUBJECTNA\$/$subjectl/g;