#!/usr/local/bin/perl use Config; use File::Basename qw(&basename &dirname); # List explicitly here the variables you want Configure to # generate. Metaconfig only looks for shell variables, so you # have to mention them as if they were shell variables, not # %Config entries. Thus you write # $startperl # to ensure Configure will look for $Config{startperl}. # This forces PL files to create target in same directory as PL file. # This is so that make depend always knows where to find PL derivatives. chdir(dirname($0)); ($file = basename($0)) =~ s/\.PL$//; $file =~ s/\.pl$// if ($^O eq 'VMS' or $^O eq 'os2'); # "case-forgiving" open OUT,">$file" or die "Can't create $file: $!"; print "Extracting $file (with variable substitutions)\n"; # In this section, perl variables will be expanded during extraction. # You can use $Config{...} to use Configure variables. print OUT <<"!GROK!THIS!"; $Config{'startperl'} eval 'exec perl -S \$0 "\$@"' if 0; !GROK!THIS! # In the following, perl variables are not expanded during extraction. print OUT <<'!NO!SUBS!'; use Config; use Getopt::Std; BEGIN { eval "use Mail::Send;"; $::HaveSend = ($@ eq ""); eval "use Mail::Util;"; $::HaveUtil = ($@ eq ""); }; use strict; sub paraprint; my($Version) = "1.14"; # Changed in 1.06 to skip Mail::Send and Mail::Util if not available. # Changed in 1.07 to see more sendmail execs, and added pipe output. # Changed in 1.08 to use correct address for sendmail. # Changed in 1.09 to close the REP file before calling it up in the editor. # Also removed some old comments duplicated elsewhere. # Changed in 1.10 to run under VMS without Mail::Send; also fixed # temp filename generation. # Changed in 1.11 to clean up some text and removed Mail::Send deactivator. # Changed in 1.12 to check for editor errors, make save/send distinction # clearer and add $ENV{REPLYTO}. # Changed in 1.13 to hopefully make it more difficult to accidentally # send mail # Changed in 1.14 to make the prompts a little more clear on providing # helpful information. Also let file read fail gracefully. # TODO: Allow the user to re-name the file on mail failure, and # make sure failure (transmission-wise) of Mail::Send is # accounted for. my( $file, $usefile, $cc, $address, $perlbug, $testaddress, $filename, $subject, $from, $verbose, $ed, $fh, $me, $Is_VMS, $msg, $body, $andcc ); Init(); if($::opt_h) { Help(); exit; } if(!-t STDIN) { paraprint <; chop $subject; my($err)=0; while( $subject =~ /^\s*$/ ) { print "\nPlease enter a subject: "; $subject = <>; chop $subject; if($err++>5) { die "Aborting.\n"; } } } # Prompt for return address, if needed if( !$from) { # Try and guess return address my($domain); if($::HaveUtil) { $domain = Mail::Util::maildomain(); } elsif ($Is_VMS) { require Sys::Hostname; $domain = Sys::Hostname::hostname(); } else { $domain = `hostname`.".".`domainname`; $domain =~ s/[\r\n]+//g; } my($guess); if( !$domain) { $guess = ""; } elsif ($Is_VMS && !$::Config{'d_socket'}) { $guess = "$domain\:\:$me"; } else { $guess = "$me\@$domain" if $domain; $guess = "$me\@unknown.addresss" unless $domain; } $guess = $ENV{'REPLYTO'} if defined($ENV{'REPLYTO'}); $guess = $ENV{"REPLY-TO"} if defined($ENV{'REPLY-TO'}); if( $guess ) { paraprint <; chop $from; if($from eq "") { $from = $guess } } #if( $from =~ /^(.*)\@(.*)$/ ) { # $mailname = $1; # $maildomain = $2; #} if( $from eq $cc or $me eq $cc ) { # Try not to copy ourselves $cc = "yourself"; } # Prompt for administrator address, unless an override was given if( !$::opt_C and !$::opt_c ) { paraprint <); chop $entry; if($entry ne "") { $cc = $entry; if($me eq $cc) { $cc = "" } } } if($cc =~ /^(none|yourself|me|myself|ourselves)$/i) { $cc = "" } $andcc = " and $cc" if $cc; editor: # Prompt for editor, if no override is given if(! $::opt_e and ! $::opt_f and ! $::opt_b) { paraprint <); chop $entry; $usefile = 0; if($entry eq "file") { $usefile = 1; } elsif($entry ne "") { $ed = $entry; } } # Generate scratch file to edit report in { my($dir) = $Is_VMS ? 'sys$scratch:' : '/tmp/'; $filename = "bugrep0$$"; $filename++ while -e "$dir$filename"; $filename = "$dir$filename"; } # Prompt for file to read report from, if needed if( $usefile and ! $file) { filename: paraprint <); chop($entry); if($entry eq "") { paraprint <$filename"); print REP <) { print REP $_ } close(F); } else { print REP "[Please enter your report here]\n"; } Dump(*REP); close(REP); } sub Dump { local(*OUT) = @_; print OUT <); chop $entry; if($entry ne "") { $ed = $entry; } } tryagain: if(!$usefile and !$body) { my($sts) = system("$ed $filename"); if( $Is_VMS ? !($sts & 1) : $sts ) { #print "\nUnable to run editor!\n"; paraprint <); chop $entry; if($entry ne "") { $ed = $entry; goto tryagain; } else { paraprint <); chop $action; if( $action =~ /^(f|sa)/i ) { # ile/ve print "\n\nName of file to save message in [perlbug.rep]: "; my($file) = scalar(<>); chop $file; if($file eq "") { $file = "perlbug.rep" } open(FILE,">$file"); open(REP,"<$filename"); print FILE "To: $address\nSubject: $subject\n"; print FILE "Cc: $cc\n" if $cc; print FILE "Reply-To: $from\n" if $from; print FILE "\n"; while() { print FILE } close(REP); close(FILE); print "\nMessage saved in `$file'.\n"; exit; } elsif( $action =~ /^(d|l|sh)/i ) { # isplay, ist, ow # Display the message open(REP,"<$filename"); while() { print $_ } close(REP); } elsif( $action =~ /^se/i ) { # end # Send the message print "\ Are you certain you want to send this message? Please type \"yes\" if you are: "; my($reply) = scalar(); chop($reply); if( $reply eq "yes" ) { last; } else { paraprint <dit, e-edit # edit the message Edit(); #system("$ed $filename"); } elsif( $action =~ /^[qc]/i ) { # ancel, uit 1 while unlink($filename); # remove all versions under VMS print "\nCancelling.\n"; exit(0); } elsif( $action =~ /^s/ ) { paraprint < $subject, To => $address; $msg->cc($cc) if $cc; $msg->add("Reply-To",$from) if $from; $fh = $msg->open; open(REP,"<$filename"); while() { print $fh $_ } close(REP); $fh->close; } else { if ($Is_VMS) { if ( ($address =~ /@/ and $address !~ /^\w+%"/) or ($cc =~ /@/ and $cc !~ /^\w+%"/) ){ my($prefix); foreach (qw[ IN MX SMTP UCX PONY WINS ],'') { $prefix = "$_%",last if $ENV{"MAIL\$PROTOCOL_$_"}; } $address = qq[${prefix}"$address"] unless $address =~ /^\w+%"/; $cc = qq[${prefix}"$cc"] unless !$cc || $cc =~ /^\w+%"/; } $subject =~ s/"/""/g; $address =~ s/"/""/g; $cc =~ s/"/""/g; my($sts) = system(qq[mail/Subject="$subject" $filename. "$address","$cc"]); if (!($sts & 1)) { die "Can't spawn off mail\n\t(leaving bug report in $filename): $sts\n;" } } else { my($sendmail) = ""; foreach (qw(/usr/lib/sendmail /usr/sbin/sendmail /usr/ucblib/sendmail)) { $sendmail = $_, last if -e $_; } paraprint <<"EOF" and die "\n" if $sendmail eq ""; I am terribly sorry, but I cannot find sendmail, or a close equivalent, and the perl package Mail::Send has not been installed, so I can't send your bug report. We apologize for the inconveniencence. So you may attempt to find some way of sending your message, it has been left in the file `$filename'. EOF open(SENDMAIL,"|$sendmail -t"); print SENDMAIL "To: $address\n"; print SENDMAIL "Subject: $subject\n"; print SENDMAIL "Cc: $cc\n" if $cc; print SENDMAIL "Reply-To: $from\n" if $from; print SENDMAIL "\n\n"; open(REP,"<$filename"); while() { print SENDMAIL $_ } close(REP); close(SENDMAIL); } } print "\nMessage sent.\n"; 1 while unlink($filename); # remove all versions under VMS } sub Help { print <