belize has asked for the wisdom of the Perl Monks concerning the following question:

I recently migrated some sites from one server to another. Information on the new server gained from queries is:

Apache/1.3.12 Cobalt (Unix)
perl5.00503
/usr/sbin/sendmail

I am having the following problem. The form script works flawlessly. At each sub-routine, we have inserted an Error branch to let us know if it doesn't work. The script parses, replaces variables, opens sendmail, and retuirns the correct page upon completion. But no emails are sent.

We have tried multiple emails to test incase an email was not working. The server admins say that sendmail is working. We don't have access to any error logs.

My question: Is there a way to test if sendmail is working other than having it send an email and to see if it returns? I mean shouldn't we have some indication somewhere that the emails are or are not being sent?

Replies are listed 'Best First'.
Re: Ways to test sendmail
by Fastolfe (Vicar) on Jan 06, 2001 at 22:59 UTC
    If sendmail does end up seeming like it's being called correctly and is indeed taking the e-mail from you, perhaps look for the presence of a "dead.letter" file in your home directory.

    I might also try to print the contents of the e-mail it would have sent to sendmail (along with the command-line arguments, if they're variable) in a file to be sure that it's properly formed and everything is being passed to sendmail correctly.

      Interesting, yes there is a dead.letter file generated. What does that mean though? All it is is exactly what should be sent out.

      Thanks for the lead.

        It means sendmail is finding it difficult to deliver your mail. Try printing out a "good" e-mail to a text file (or use the dead.letter you found, though you might have to edit it a bit), and pipe it through sendmail yourself:
        $ sendmail -t <message
        See if sendmail says anything to you.
      Here is the Sub SendMail:

      sub SendMail { if (-e $FORM{'template'}) { } else { &Error('Template File Not Found - Error at sendmail subscri +pt'); } open (FILE, $FORM{'template'}); @File = <FILE>; close (FILE); open (MAIL, "|$mailprog -t") || &Error('Unable to Open Sendmail'); print MAIL "To: $FORM{'mailto'}\n"; print MAIL "From: $FORM{'req-EMail'} ($FORM{'req-FName'} $FORM{'re +q-LName'})\n"; print MAIL "Subject: $FORM{'subject'}\n"; print MAIL "Bcc: \n\n"; print MAIL "This information request form is from the Rainforest & + Reef Resorts of Belize website.\n"; print MAIL "*************************************************\n"; print MAIL "This form was submitted at $time by $FORM{'req-FName'} + $FORM{'req-LName'} ($FORM{'req-EMail'}).\n"; print MAIL "For your records, this is Form Request Number \= $Orde +r from this website.\n"; print MAIL "*************************************************\n\n" +; foreach $File (@File) { $File =~ s/\n//; foreach $Field (@InputFields) { $ReplaceVar = $FORM{$Field}; $SearchVar = '\[' . $Field . '\]'; $File =~ s/$SearchVar/$ReplaceVar/g; } print MAIL "$File\n"; } close (MAIL); }

      After performing this subroutine, it then:

      sub Redirect { if ($FORM{'success'}) { print "Location: $FORM{'success'}\n\n"; } }
      The "success" page is returned, but the mail does not go out and the email is added to the "dead.letter" file.

      Any ideas?

        Hmmm, well Some hints (no big help though):
        sub SendMail { # add debugging my $debug = 6; if (-e $FORM{'template'}) { } else { &Error('Template File Not Found - Error at sendmail subsc +ript'); }
        Normally (note adding the missing file name to error msg):
        if ( ! -e $FORM{'template'}) { &Error('Template File $FORM{template} Not Found - Error at sendma +il subscript'); } open (FILE, $FORM{'template'});<br>
        always:
        open (FILE, $FORM{'template'}) or die "can't open FILE $FORM{tem +plate}: $!";<br> @File = <FILE>; close (FILE); open (MAIL, "|$mailprog -t") || &Error('Unable to Open Sendmail' +);
        Try:
        open (MAIL, "|$mailprog -t") || &Error("Unable to Open $mailprog +: $!"); print "<p>trying: $mailprog -t<br> To: $FORM{mailto}<br> From: $FORM{req-EMAIL} ($FORM{req-FName} $FORM{req-LName})<br> Subject: $FORM{subject}<br>\n" if $debug > 5; print MAIL "To: $FORM{'mailto'}\n"; print MAIL "From: $FORM{'req-EMail'} ($FORM{'req-FName'} $FORM{' +re +q-LName'})\n"; print MAIL "Subject: $FORM{'subject'}\n"; print MAIL "Bcc: \n\n"; print MAIL "This information request form is from the Rainforest + & + Reef Resorts of Belize website.\n"; print MAIL "*************************************************\n" +; + print MAIL "This form was submitted at $time by $FORM{'req-FName +'} + $FORM{'req-LName'} ($FORM{'req-EMail'}).\n"; print MAIL "For your records, this is Form Request Number \= $Or +de +r from this website.\n"; print MAIL "*************************************************\n\ +n" +; foreach $File (@File) { $File =~ s/\n//; foreach $Field (@InputFields) { $ReplaceVar = $FORM{$Field}; $SearchVar = '\[' . $Field . '\]'; $File =~ s/$SearchVar/$ReplaceVar/g;
        This is odd, does each file (file name) possibly have every/any input field w/i it? Anyway, this is/may be 'cooler'
        $File =~ s/\[$Field]/$FORM{$Field}/g; # do you need an 'e' too? } print MAIL "$File\n"; } close (MAIL); }
        Only thing I can see is that, as you don't (here) verify the sender's address or the To: address, it may have junk in there that sendmail doesn't like. Do you need pointy brackets around the actual To|From address parts?

        a

Re: Ways to test sendmail
by ichimunki (Priest) on Jan 06, 2001 at 22:42 UTC
    Two thoughts: LWP::SMTP and
    Please post a snippet from the script and/or HTML form, so we can see that. It sounds like you're not trapping an uncalled system call, or that you're not calling sendmail correctly, or something like that.
Re: Ways to test sendmail
by Anonymous Monk on Jan 07, 2001 at 16:03 UTC
        -bt  Run in address test mode.  This mode reads addresses and shows the
              steps in parsing; it is used for debugging configuration tables.
         -bv  Verify names only - do not try to collect or deliver a message.
              Verify mode is normally used for validating users or mailing lists.
         -v   Go into verbose mode.  Alias expansions will be announced, etc.