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 <[EMAIL PROTECTED]> 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] =~ /[@%]/) + { + return split /[@%]/, $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] =~ /[@%]/) + { + return (split /[@%]/, $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] =~ /[@%]/) + { + return (split /[@%]/, $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;