#!/mit/belg4mit/bin/perl -w use strict; use Mail::Sendmail qw(sendmail time_to_date); use Term::ReadLine; use Getopt::Long; use vars '%opts'; my(%MH, @MSG); require "$ENV{HOME}/.mailerrc"; GetOptions(\%opts, "1", "Bcc=s", "Fcc:s", "SMTP=s", "Sub=s", "cc=s", "noFcc:i", "sig!"); $opts{Fcc} = 1 if $opts{Fcc} eq ''; $opts{Fcc} = 0 if $opts{noFcc}; print "SMTP:$opts{SMTP}\tFcc:$opts{Fcc}\tIndividual:$opts{1}\tUse sig:$opts{sig}\n"; #Complain if cc/Bcc && 1 if( @ARGV ){ @ARGV = grep {s/^mailto://oi || $_ } @ARGV; } else{ print "Enter names to send To now, return when done\n"; chomp($_=); @ARGV = split(/,\s*/ ,$_); } open(MH, "$ENV{HOME}/.mh_profile") || warn("Could not locate .mh_profile\n"); while(){ /^(.*):\s*(.*)\s*/; $MH{$1} = $2; } close(MH); $MH{Path} = "$ENV{HOME}/$MH{Path}" unless $MH{Path} =~ m%^/%; $MH{Aliasfile} = "$MH{Path}/$MH{Aliasfile}" unless $MH{Aliasfile} =~ m%^(/|~)%; if( open(ALI, $MH{Aliasfile}) || warn("Achtung! Unable to expand aliases") ){ sub parse { my($a,$b) = split(/:\s*|\n/, $_[0]); $MH{Ali}->{$a}=$b; }; map(parse($_), grep {!/^(;|$)/} ()); close(ALI); #Bad hack for aliases of aliases for( 0 .. 1 ){ @ARGV = map($MH{Ali}->{$_}||$_, @ARGV); $opts{Bcc} = join(', ',map($MH{Ali}->{$_}||$_, split(',', $opts{Bcc}))) if exists($opts{Bcc}); $opts{cc} = join(', ',map($MH{Ali}->{$_}||$_, split(',', $opts{cc}))) if exists($opts{cc}); } } $opts{Bcc}||=''; $opts{cc}||=''; #If verbose, split across lines... #Move Fcc to here? print "To: @ARGV;\tcc: $opts{cc};\tbcc: $opts{Bcc}\n"; if( $opts{Sub} ){ #if verbose print "Subject: $opts{Sub}\n"; } else{ print "Enter subject\n"; chomp($opts{Sub}=); } print "Type your message now. End with control-D or a dot on a line by itself.\n"; my $term = new Term::ReadLine 'Simple Mailer'; $term->ornaments(0); $ENV{'PERL_READLINE_NOWARN'} = 1; while( defined( $_ = $term->readline('') ) ){ last if /^\.$/; #What if go up multiple lines?!!!! pass an arg to ^V? Can term tell me? if( // ){ splice(@MSG, -2, 1); } else{ push @MSG, $_; } } if( -f "$MH{Path}/components" ){ open(SIG, "$MH{Path}/components") || warn("Unable to open '$MH{Path}/components'"); push @{$MH{_arSignature}}, "-- \n"; while(){ if( 1 .. /^-- $/ ){ push(@{$MH{_arHeaders}}, $_) unless /^-- $/;; } else{ push @{$MH{_arSignature}}, $_; } } } if( ($opts{sig} ) ){ $MH{_arSignature} = []; if( -f "$ENV{HOME}/.signature" ){ open(SIG, "$ENV{HOME}/.signature") || warn("Unable to open '.signature'"); push @{$MH{_arSignature}}, ; } close(SIG); } $MH{_haHeaders} = {}; foreach ( @{$MH{_arHeaders}} ){ /^(.+):\s*(.+)\s*/; $MH{_haHeaders}->{$1}=$2; } delete @MH{'Bcc', 'Fcc', 'cc', 'Subject', 'To'}; if( $opts{Fcc} ){ #Fcc (save only one draft even if -1) $MH{Fcc} = $MH{_haHeaders}->{Fcc} || 'drafts'; $MH{Fcc} = $opts{Fcc} if $opts{Fcc} && $opts{Fcc} ne '1'; opendir(FCC, "$MH{Path}/$MH{Fcc}") || warn("Unable to reach '$MH{Fcc}'"); my $n = (sort {$a <=> $b} grep {/^\d+$/} readdir(FCC))[-1]+1; closedir(FCC); open(FCC, ">$MH{Path}/$MH{Fcc}/$n"); push @{$MH{_arHeaders}}, "Date: @{[time_to_date]}\n"; foreach (@{$MH{_arHeaders}}){ $_ =~ s/$/join(",", @ARGV)/e if /^To:/; $_ =~ s/$/$opts{Sub}/ if /^Subject:/; $_ = '' if /^((Fcc)|(-+))/; } #include collapsed / Expands-To header? print FCC @{$MH{_arHeaders}}, "\n", join("\n", @MSG), @{$MH{_arSignature}}; close(FCC); } $| = 1; my $From = $MH{Signature} || $ENV{SIGNATURE}; unless( $From ){ open(RESOLV, "/etc/resolv.conf"); (grep {/domain/} ())[0] =~ /domain\s*(.+)\s*/; my $DOMAIN = $1; close(RESOLV); #MIT outgoing server has issues... # $From = (split(',', (getpwnam($ENV{USER}))[6]))[0]; # $From = "$From <$ENV{USER}\@$DOMAIN>"; $From = "$ENV{USER}\@$DOMAIN"; #UCI option... ~/.signature } if( $opts{1} ){ map { sendMail($_) } @ARGV; } else{ sendMail(join(', ', @ARGV)); } sub sendMail{ print "Sending to $_[0]...\t"; my(%mail, $MSG);; if( $opts{sig} ){ %mail = %{$MH{_haHeaders}}; $MSG = join('', join("\n", @MSG), "\n", @{$MH{_arSignature}}); } else{ $MSG = join("\n", @MSG). "\n"; } %mail = ( %mail, From => $From, To => $_[0], Bcc=> $opts{Bcc}, Cc=> $opts{cc}, Subject => $opts{Sub}, Message => $MSG, smtp => $opts{SMTP}); # print join("\n", %mail); print sendmail(%mail) ? "OK\n" : $Mail::Sendmail::error; }