####################################################################### # Application Information # ######################################################################## # Application Name: SENDMAIL_LIB.PL # Application Authors: Gunther Birznieks and Eric Tachibana (Selena Sol) # Version: 1.0 # Last Modified: 17NOV98 # # Copyright: # # You may use this code according to the terms specified in # the "Artistic License" included with this distribution. The license # can be found in the "Documentation" subdirectory as a file named # README.LICENSE. If for some reason the license is not included, you # may also find it at www.extropia.com. # # Though you are not obligated to do so, please let us know if you # have successfully installed this application. Not only do we # appreciate seeing the wonderful things you've done with it, but we # will then be able to contact you in the case of bug reports or # security announcements. To register yourself, simply send an # email to register@extropia.com. # # Finally, if you have done some cool modifications to the scripts, # please consider submitting your code back to the public domain and # getting some community recognition by submitting your modifications # to the Extropia Cool Hacks page. To do so, send email to # hacks@extropia.com # # Description: # # Provides a set of library routines to send email # over the internet. # # Main Procedures: # # real_send_mail - flexible way to send email # send_mail - easier to use version of send_mail # # Special Notes: # # Script is UNIX Specific and ties into the # Sendmail Program which is usually located in /usr/lib or # /usr/bin. If you want to use this for Windows or Macintosh # CGI scripts, you must copy the contents of smtp-mail.lib # over this. You can get that file at www.extropia.com # # Also, remember to escape @ signs with a backslash (\@) # for compatibility with PERL 5. # # Change the $mail_program variable to change location of your # sendmail program # # Basic Usage: # # 1. The file should have read access but need not have write access # nor execute access. # # More Information # # You will find more information in the Documentation sub-directory. # We recommend opening the index.html file with your web browser to # get a listing of supporting documentation files. ######################################################################## # Application Code # ######################################################################## # $mail_program is the mail program used to send mail # with the full path. # # The -t flag tells sendmail to # look for To:, From:, Subject: header lines in the # mail message to determine the addresses to send to. # # NOTE: BY DEFAULT, I AM NOT USING -n and -f flags. # # -n is not supported by QMAILs sendmail replacement. # # -f is useful for special cases and can be added as needed. # # The -n flag tells sendmail not to use the alias list # for the UNIX server. We do not want outsiders using # the alias list of the webserver in most cases. # # The -f flag followed by an email address of your choice # basically tells sendmail that this email address # should have bounced mails forwarded. Use of this flag # was suggested by Ignacia Bustamante. # $flags = "-t"; # The following code checks for versions of # sendmail and lets the user know if one of the # default locations does not exist. # # The code for this trick was donated by Scott Wimer # with some slight modification by Gunther for command # line flag flexibility at the end $mailer = '/bin/sendmail'; $mailer1 = '/bin/sendmail'; $mailer2 = '/bin/sendmail'; if ( -e $mailer) { $mail_program=$mailer; } elsif( -e $mailer1){ $mail_program=$mailer1; } elsif( -e $mailer2){ $mail_program=$mailer2; } else { print "Content-type: text/html\n\n"; print "I can't find sendmail, shutting down...
"; print "Whoever set this machine up put it someplace weird."; exit; } # Add the command line flags $mail_program = "$mail_program $flags "; ############################################################ # # subroutine: real_send_mail # Usage: # &send_mail("me@myhouse.com","myhouse.com","you@yourhouse.com", # "yourhouse.com", "Mysubject", "My message"); # # Parameters: # $fromuser = Full Email address of sender # $fromsmtp = Full Internet Address of sender's SMTP Server # $touser = Full Email address of receiver # $tosmtp = Full Internet Address of receiver's SMTP Server # $subject = Subject of message # $messagebody = Body of message including newlines. # # Output: # None ############################################################ sub real_send_mail { local($fromuser, $fromsmtp, $touser, $tosmtp, $subject, $messagebody) = @_; # First we need to start the mail program and open # a PIPE to the program so that anything # we print to the filehandle, goes to the running # program. # The path manipulation is to satisfy taint mode # local($old_path) = $ENV{"PATH"}; $ENV{"PATH"} = ""; open (MAIL, "|$mail_program") || &web_error("Could Not Open Mail Program"); $ENV{"PATH"} = $old_path; # # Print the mail message to the Mail Program # using the HERE Document method # # Note: SOME ISPs may have a faulty # sendmail implementation that does # not recognize the From: header unless # the order of these is changed from # To: From: Subject: # to # Subject: To: From: # # This was pointed out by Paul Tate. ##### Begin Hack Mod print MAIL "To: $touser \n"; print MAIL "From: $fromuser \n"; print MAIL "Subject: $subject \n"; print MAIL "$messagebody \n"; close (MAIL); #print MAIL qq!To: $touser #From: $fromuser #Subject: $subject #### End Hack Mod #$messagebody #!; # close (MAIL); } #end of real_send_mail ############################################################ # # subroutine: send_mail # Usage: # &send_mail("me@myhouse.com","you@yourhouse.com", # "Mysubject", "My message"); # # Parameters: # $fromuser = Full Email address of sender # $touser = Full Email address of receiver # $subject = Subject of message # $messagebody = Body of message including newlines. # # Output: # None # ############################################################ sub send_mail { local($from, $to, $subject, $messagebody) = @_; local($fromuser, $fromsmtp, $touser, $tosmtp); # This routine takes the simpler parameters of # send_mail and breaks them up into the parameters # to be sent to real_send_mail. # $fromuser = $from; $touser = $to; # # Split is used to break the address up into # user and hostname pairs. The hostname is the # 2nd element of the split array, so we reference # it with a 1 (since arrays start at 0). # $fromsmtp = (split(/\@/,$from))[1]; $tosmtp = (split(/\@/,$to))[1]; # Actually call the sendmail routine with the # newly generated parameters # &real_send_mail($fromuser, $fromsmtp, $touser, $tosmtp, $subject, $messagebody); } # End of send_mail ############################################################ # # subroutine: web_error # Usage: # &web_error("File xxx could not be opened"); # # Parameters: # $error = Description of Web Error # # Output: # None # ############################################################ sub web_error { local ($error) = @_; $error = "Error Occured: $error"; print "$error

\n"; # Die exits the program prematurely and prints an error to # stderr die $error; } # end of web_error 1;