Patric Steffen: (Provider) Mails werden nicht immer versendet

Hallo,

habe folgende(s) Problem(e):

1. Ich habe eine Site bei Puretec gehostet.
2. Unter dieser Site benutze ich mehrere Scripts, die eMails via sendmail (Linux) verschicken. Die Mails werden korrekt versendet, falls ich eine feste eMail-Adresse als Adressaten hardcodiert angebe. Sobald ich allerdings als Adressaten den Inhalt eines Formularfeldes angebe (mittels param('eMail') z.B.), so tritt es häufig auf, dass die eMails nicht bei diesem eintreffen. Puretec gewährt bisher leider keinen Einblick in Ihre Mail-Server-Logs, so dass ich die Ursache dieses Fehlers bis jetzt nicht finden konnte.
Hatte jemand schon einmal solche Probleme mit Puretec? Oder liegt es vielleicht daran, dass ich fehlerhaft programmiert habe? Bin für jeden Tip dankbar.

Gruß
Patric

Anbei der Code:

1. Auszug aus einem Script, dass ein Formular anzeigt, und die Funktion aufruft, welche eine eMail verschicken soll.

a) Anzeige des Formulars:
print startform({-name=>'recommendation', -action=>'recommendation.pl', -method=>'POST'}),
    table({-width=>$c{common}{width}, border=>'0', -align=>'left'},
...
      td(textfield({-name=>'eMailAdressat', -size=>'34', -maxlength=>'40', -override=>1}))),
...
     Tr( td(submit({-name=>'submit', -value=>'Weiterempfehlen'})),
      td(reset({-name=>'Eingaben Verwerfen', -value=>'Verwerfen'}))),
...
    ),
   endform(),
   end_html();

b) Aufruf der Funktion zum Versenden einer eMail:

sub prepareRecommendation() {
my($error, $contents);

$error  = 0;

$contents = "String, welcher den Text der eMail enthält\n\n".

$error  = Schulkameraden::IOFunc::sendMail( "Absender-Account@domain.de",
              param('eMailAdressat'),
              "Betreff",
              $contents);

return($error);
}

2. Funktion sendMail, welche sendmail aufruft

Dieses Script versendet eine eMail. Text, Betreff, Absender, Adressat sind Übergabeparameter

sub sendMail {
my($sender, $addressee, $subject, $contents);

$sender  = $_[0];
$addressee = $_[1];
$subject = $_[2];
$contents = $_[3];

# Ausführen von sendmail
    open(MAIL, "$c{dir}{mailprog} $addressee") or die "Fehler beim Versenden der eMail: $!";

print MAIL "From: $sender\n",
    "Reply-To: $sender\n",
    "To: $addressee\n",
    "Subject: $subject\n\n",
    $contents;
    close (MAIL);

return(0);
}

  1. Hallo,

    1. Unter dieser Site benutze ich mehrere Scripts, die eMails via sendmail (Linux) verschicken. Die Mails werden korrekt versendet, falls ich eine feste eMail-Adresse als Adressaten hardcodiert angebe. Sobald ich allerdings als Adressaten den Inhalt eines Formularfeldes angebe (mittels param('eMail') z.B.), so tritt es häufig auf, dass die eMails nicht bei diesem eintreffen.

    Vielleicht hat der Absender keine gültige Email-Adresse angegeben.
    Es kann auch sein, daß die Empfängerdomain keinen gültigen MX-Record im DNS eingetragen hat. Da gibts viele Ursachen.

    Hier nur ein paar DInge, die mir auf die Schnelle aufgefallen sind:

    »»  $error  = Schulkameraden::IOFunc::sendMail( "Absender-Account@domain.de",

    entweder
       "Absender-Account@domain.de"
    oder besser
       'Absender-Account@domain.de'
    An dem kanns auch liegen, wenn der Empfänger-Server mämlich keinen Absender mit dem Namen 'Absender-Account.de' erlaubt. Das kommt nämlich als erster Parameter zu Deiner sendMail-Funktion. In Perl 5.6 würde dies übrigens eine Fehlermeldung verursachen, wenn @domain nicht vorher definiert worden wäre.

    sub sendMail {

    »»  my($sender, $addressee, $subject, $contents);

    »»  $sender  = $_[0];
    »»  $addressee = $_[1];
    »»  $subject = $_[2];
    »»  $contents = $_[3];

    my($sender, $addressee, $subject, $contents) = @_;
    erfüllt den gleichen Zweck und ist einfacher zu kodieren;-)

    Grüße
      Klaus

    1. Hi,

      »»  $error  = Schulkameraden::IOFunc::sendMail( "Absender-Account@domain.de",

      entweder
         "Absender-Account@domain.de"
      oder besser
         'Absender-Account@domain.de'

      Uups, hab' mich verschrieben, im Original ist korrekt angegeben. Hab's mit eMail-Adressen (bekannter eMail-Provider) ausprobiert, die existieren. Manchmal kommen die Mails an, manchmal nicht.
      Besteht die Möglichkeit, dass der Mail-Server verkonfiguriert ist bei Puretec, oder kann's am CGI.pm/Perl-Interpreter liegen, welcher dort eingesetzt wird?

      Gruß
      Patric

      1. Hallo,

        Besteht die Möglichkeit, dass der Mail-Server verkonfiguriert ist bei Puretec, oder kann's am CGI.pm/Perl-Interpreter liegen, welcher dort eingesetzt wird?

        Zum Mailserver:
        Das läßt sich von Weitem nicht beantworten. Ich denke, daß es gut wäre, wenn Du alle Daten zum Debuggen auch irgendwie anders zugänglich machst, was weiß ich, indem Du alles mal ausgibst, in eine datei schreibst, es Dir selbst mailst( vielleicht nicht unbedingt die beste Variante).
        Wichtig wäre, wenn Du als Absender unbedingt Deine Mail-Adresse angibst, damit Du eventuelle Fehlermeldungen vom Mailserver auch wirklich zugestellt bekommst. Daran kannst Du erkennen, warum der Server die Mail nicht zustellen konnte.
        Fehlerbehandlungen sollten auch eingebaut werden.

        zu CGI.pm/Perl:
        Ich denke nicht, aber man kann ja nie wissen.

        Solche Fehler sind oft sehr schwer zu finden. Das Blinker-Syndrom (geht, geht nicht, geht, geht nicht) hat schon viel Programmierer an den Rande der Verzweiflung getrieben ;-)

        Grüße
          Klaus

  2. Neben den allgemeinen Tips wie die Verwendung des -w Switches und use strict:

    # Ausführen von sendmail
        open(MAIL, "$c{dir}{mailprog} $addressee") or die "Fehler beim Versenden der eMail: $!";

    Es waere hilfreich, zu wissen, wie das hier nach Variablenersetzung aussieht. Theoretisch geht es so:

    open MAIL, "/usr/lib/sendmail -oi -t" or die "Can't fork for sendmail: $!\n";

    print MAIL "From: $sender\n",
        "Reply-To: $sender\n",
        "To: $addressee\n",
        "Subject: $subject\n\n",
        $contents;
        close (MAIL);

    Auch beim close *immer* Fehler abfangen, denn letztendlich steht erst
    hier fest, ob der Aufruf erfolgreich war. Also:

    close MAIL or die "can't close sendmail nicely: $!\n";

    »»  return(0);

    }

    Peter