On Mon, Aug 06, 2001 at 06:28:57PM -0500, David Champion wrote:
> On 2001.08.06, in <[EMAIL PROTECTED]>,
>       "Mike Erickson" <[EMAIL PROTECTED]> wrote:
> > 
> > All that would be necessary is a maillist_file setting in my .muttrc
> > just like alias_file, and add a command to add addresses to it. Although
> > it'd be a nice bonus, it's not even necessary to autoparse the addresses
> > out of an email. Just being able to maintain that list from within mutt
> > would be good enough.
> 
> You can have the first part of this, of course, by adding
>       source ~/.mutt/lists
> or somesuch to your .muttrc file.  I have .muttrc functionalities split
> out into several such files, all sourced from .muttrc.
> 
> The rest can be tricky; there's no sure-shot way to determine which
> address from the header (if any) is a mailing list address. For every
> rule you can make up, some list (or list manager) does it differently.
> 
> Here's a possibility, though. I'm in a perl-thwacking mood today, I
> guess. Save this attachment in your path as "addlist", and try executing
> it via macro something like this:
> 
> macro index \Co "<pipe-message>addlist ~/.mutt/lists<enter>" "Scan a message for 
>mailing lists to add"
> macro pager \Co "<pipe-message>addlist ~/.mutt/lists<enter>" "Scan a message for 
>mailing lists to add"

To get these to work I had replace ~/.mutt etc with a full path to the
file. ~ does not seem to work in mutt macros for me. The perl script
would be better if it tested whether the open statement actually worked.

Cheers, Brian.
 
> The argument to addlist should be the file you store mutt's "lists" and
> "subscribe" lines in.
> 
> This program will use formail to look for likely list names in the
> message you're viewing or that's highlighted in the index. It will check
> for what list patterns already are defined in your lists file, and if
> any addresses it discovers in the message are not matched by a lists or
> subscribe command, it will ask you whether it should add such a line to
> the lists file, and then do it.
> 
> No particular reason for ^O except that it was available in my
> configuration.  No warranty, use at your own risk, &c.
> 
> -- 
>  -D.  [EMAIL PROTECTED]        NSIT    University of Chicago

> #!/usr/bin/perl
> 
> require "ctime.pl";
> 
> if ($#ARGV != 0) {
>       print STDERR "usage: $0 /path/to/lists/file\n";
>       exit (1);
> }
> 
> # Remember how to clean up the terminal
> $sane = `stty -g </dev/tty`;
> chomp $sane;
> 
> 
> # Clean up on exit.
> sub sanitize () {
>       `stty $_[0] </dev/tty`;
> }
> for $sig (INT, QUIT, HUP, TERM) {
>       $SIG{$sig} = \&sanitize($sane);
> }
> 
> # Find usable addresses from the mail headers. Formail receives our stdin.
> open (FORMAIL, "formail -xTo: -xCc: -xList-ID: -xSender: |") || exit (1);
> while (<FORMAIL>) {
>       chomp;
>       s/^ *//;
>       s/ *$//;
>       s/.*<([^>]*)>.*/$1/;
>       s/-(admin|owner|request)\@/\@/;
>       s/^owner-//;
>       s/\./\@/ unless (/\@/);
>       $uniq{$_} = $_;
> }
> close (FORMAIL);
> 
> # Check extant lists file, and discover addresses already in it.
> open (LISTS, $ARGV[0]);
> while (<LISTS>) {
>       chomp;
>       s/^\s+//;
>       next unless /^(lists|subscribe)/;
>       s/#.*//;
>       s/\s+$//;
>       s/.*(lists|subscribe)\s*//;
>       map { $already{$_} = $_ } split(' ', $_);
> }
> close (LISTS);
> 
> # Exclude matching addresses from new list.
> for $addr (keys %uniq) {
>       for $exist (keys %already) {
>               delete $uniq{$addr} if ($addr =~ /$exist/);
>       }
> }
> 
> # Go into raw mode for the prompts.
> `stty raw </dev/tty`;
> 
> # Prompt whether to add each address discovered.
> $| = 1;
> open (TTY, "/dev/tty");
> for $addr (sort keys %uniq) {
>       while (1) {
>               print "Add $addr as a list [y/n]? ";
>               sysread (TTY, $ch, 1);
>               print "\r\n";
>               if (lc($ch) eq "n") {
>                       delete $uniq{$addr};
>                       last;
>               }
>               last if (lc($ch) eq "y");
>       }
> }
> 
> # Clean up terminal.
> &sanitize($sane);
> 
> # Append to lists file, if necessary.
> @_ = keys %uniq;
> $n = $#_ + 1;
> if ($n > 0) {
>       open (LISTS, ">> $ARGV[0]");
>       $date = &ctime(time);
>       chomp $date;
>       $s = "s" if ($n > 1);
>       print LISTS "# $n list$s added by $0 at $date\n";
>       map {
>               print LISTS "subscribe $_\n";
>       } sort keys %uniq;
>       print LISTS "\n";
>       close (LISTS);
> }
> 
> print "\n";
> print "$n lists added to $ARGV[0].\n";
> print "\n";
> exit (0);


-- 
Associate Professor Brian Salter-Duke (Brian Duke) [EMAIL PROTECTED]  
Chemistry, School of BECS, SITE, NT University, Darwin, NT 0909, Australia.
Phone 08-89466702.     Fax 08-89466847.     http://www.smps.ntu.edu.au/

Reply via email to