romy: mail() bzw. fsockopen

Hi,

zum mailversandbenutzte ich bisher immer die FUnktion mail(), stressig dabei ist, dass diese keinen Fehler zurückgibt, auh wenn die mails nicht gesendet werden.

Um die Fehler zu bemerken bin ich auf ein Beispiel mit fsockopen bei php.net gestossen.

<code>
function socketmail($toArray, $subject, $message, $froma, $fromn) {
 // $toArray format --> array("Name1" => "address1", "Name2" => "address2", ...)

ini_set(sendmail_from, $from);

$connect = fsockopen (ini_get("SMTP"), ini_get("smtp_port"), $errno, $errstr, 30) or die("Could not talk to the sendmail server!");
 $rcv = fgets($connect, 1024);

fputs($connect, "HELO {$_SERVER['SERVER_NAME']}\r\n");
 $rcv = fgets($connect, 1024);

while (list($toKey, $toValue) = each($toArray)) {
  fputs($connect, "MAIL FROM:{$froma}\r\n");
  $rcv = fgets($connect, 1024);
  fputs($connect, "RCPT TO:{$toValue}\r\n");
  $rcv = fgets($connect, 1024);
  fputs($connect, "DATA\r\n");
  $rcv = fgets($connect, 1024);

fputs($connect, "Subject: {$subject}\r\n");
  fputs($connect, "From: {fromn} <{$froma}>\r\n");
  fputs($connect, "To: $toKey  <{$toValue}>\r\n");
  fputs($connect, "X-Sender: <{$froma}>\r\n");
  fputs($connect, "Return-Path: <{$froma}>\r\n");
  fputs($connect, "Errors-To: <{$froma}>\r\n");
  //fputs($connect, "X-Mailer: PHP\r\n");
  //fputs($connect, "X-Priority: 3\r\n");
  fputs($connect, "Content-Type: text/plain\r\n");
  //fputs($connect, "\r\n");
  fputs($connect, stripslashes($message)." \r\n");

fputs($connect, ".\r\n");
  $rcv = fgets($connect, 1024);
  fputs($connect, "RSET\r\n");
  $rcv = fgets($connect, 1024);
 }

fputs ($connect, "QUIT\r\n");
 $rcv = fgets ($connect, 1024);
 fclose($connect);
 ini_restore(sendmail_from);

return $rcv;
}
</code>

Das Problem ist jetztl, dass ich bei jedem Aufruf eine andere Fehlermeldung erhalte.
zB. error 500: da findet er immer irgendwelchen Content nicht (zB die message)
    error 221: konnte nicht finden was das heisst
    error 225: hab nicht verstanden was das heisst. (irgendwas mit relay)

Jetzt komme ich bei der Fehlerfindung aber auch nicht vorwärts, wenn es immer andere Fehler sind und ich annehmen muss, das das Script spinnt.

Ich habe leider keinen Zugriff auf die Einstellungen des mail-servers, ich weiss nur, dass es vor 2 Tagen noch keine Probleme gab und jetzt die mails nicht mehr rausgehen. Ich versuche jetzt den Fehler zu spezifizieren um darauf hinweisen zu können. Im Moment weiss ich aber nicht mal ob es nicht an meinem Script liegt.

vielen Dank

ciao
romy

--
DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN\n\nsh:( fo:| ch:? rl:( br:& va:| zu:) ss:| ls:[\nDie Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html\nEinen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode
  1. Hi,

    hat sich erledigt, es funktioniert, war ein Syntaxfehler.

    ciao
    romy

    --
    DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
    sh:( fo:| ch:? rl:( br:& va:| zu:) ss:| ls:[
    Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
    Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode
  2. zum mailversandbenutzte ich bisher immer die FUnktion mail(), stressig dabei ist, dass diese keinen Fehler zurückgibt, auh wenn die mails nicht gesendet werden.

    Das würde mich wundern, eigentlich geben SMTP-Dienste immer eine Fehlermeldung aus. Es kann natürlich sein, daß der Fehler per Mail in Dein Postfach wandert, aber irgendwas sollte kommen.

    Es ist im übrigen sowieso zu viel verlangt, daß der Mailversand sofort eine Fehlermeldung liefert. Es gibt Server, die sind kurzfristig nicht erreichbar, warum willst Du dan sofort eine Fehlermeldung haben, wenn es Dein Mailserver nach ein paar weiteren Versuchen doch noch schaffen kann, die Mail zuzustellen? Weiterhin können Mails auch mehrere Zwischenstationen nehmen. Einen Fehler am Ende der Kette kann das System am Anfang der Kette nicht vorhersehen.

    function socketmail($toArray, $subject, $message, $froma, $fromn)
    $connect = fsockopen (ini_get("SMTP"), ini_get("smtp_port"), $errno, $errstr, 30) or die("Could not talk to the sendmail server!");

    Dieses Vorhaben ist etwas sinnlos, denn Du machst mit viel Aufwand nur das, was mail() auch macht, baust Dir aber noch haufenweise eigene Fehlerquellen ein.

    Unzustellbare Mails wirst Du darüber hinaus auf _diesem_ Wege (Versand an den _eigenen_ Mailserver) auch nicht automatisch erkennen, denn _Dein_ Mailserver akzeptiert die Mail erstmal und versucht erst anschließend, sie an das Ziel weiter zu leiten. Im Ergebnis passiert (mit viel Aufwand) exakt dasselbe, was schon mit mail() passieren sollte: Du bekommst eine Fehlermeldung per Post zugestellt.

    Wenn Du also nicht zustellbare Mails erkennen willst, dann mußt Du schon selbst Verbindungen zu den Zielsystemen herstellen. Davon ist aber in einem vom Webserver gesteuerten PHP-Skript dringenst abzuraten, denn (wie bereits gesagt) nicht jeder Server ist erreichbar, wenn Du Deine Mails absetzen willst. Ein echter Mailserver ist hingegen in der Lage, Post auf Halde zu legen und es nochmal zu probieren, mal ganz zu schweigen von einigen anderen Dingen, die den Versand erleichtern. Bitte versuche nicht mit etwas vollkommen Ungeeignetem wie PHP, diese Arbeit selbst zu erledigen.

    fputs($connect, "HELO {$_SERVER['SERVER_NAME']}\r\n");
    $rcv = fgets($connect, 1024);
    while (list($toKey, $toValue) = each($toArray)) {

    Ich gehe mal davon aus, daß Du die Fehlerprüfung nur für das Forum weggelassen hast.

    Das Problem ist jetztl, dass ich bei jedem Aufruf eine andere Fehlermeldung erhalte.
    zB. error 500: da findet er immer irgendwelchen Content nicht (zB die message)
        error 221: konnte nicht finden was das heisst
        error 225: hab nicht verstanden was das heisst. (irgendwas mit relay)

    Es ist nicht unbedingt hilfreich, den erklärenden Text, den der Mailserver hinter dem Fehlercode ausspuckt, abzuschneiden und durch "ich weiß nicht, was das bedeutet" zu ersetzen.

    "irgendwas mit relay" dürfte jedenfalls seine Ursache darin haben, daß Dein Mailserver per SMTP ohne Authentifizierung nur Post für sich selbst akzeptiert, aber keine Post für andere Rechner (relay=Relaisstation, Zwischenstation, Verbinder). Das ist ein Schutz gegen Spammer.

    Alles in allem solltest Du besser versuchen, die per Post zugestellten Fehlermeldungen an Dein Versandsystem zu geben anstatt den SMTP-Versand von vorne bis hinten selbst zu erledigen.

    Gruß,
      soenk.e

    1. Hi,

      Das würde mich wundern, eigentlich geben SMTP-Dienste immer eine Fehlermeldung aus. Es kann natürlich sein, daß der Fehler per Mail in Dein Postfach wandert, aber irgendwas sollte kommen.

      habe das Problem gemerkt, es werden in dem socket_mail-script an verschiedenen Stellen Fehler geschrieben und je nach dem wo er abbrach brachte er logischerweise eine andere Fehlermeldung.
      Als ich es gesamt habe ausgeben lassen, war es auf einmal sonnenklar. Ein Syntaktischer FEhler.

      Es ist im übrigen sowieso zu viel verlangt, daß der Mailversand sofort eine Fehlermeldung liefert. Es gibt Server, die sind kurzfristig nicht erreichbar, warum willst Du dan sofort eine Fehlermeldung haben, wenn es Dein Mailserver nach ein paar weiteren Versuchen doch noch schaffen kann, die Mail zuzustellen? Weiterhin können Mails auch mehrere Zwischenstationen nehmen. Einen Fehler am Ende der Kette kann das System am Anfang der Kette nicht vorhersehen.

      mhm...
      das habe ich glaube ich nicht gemeint, ich war nur auf Fehlersuche und wollte demzufolge wissen, wo überhaupt ein Fehler auftritt.

      fputs($connect, "HELO {$_SERVER['SERVER_NAME']}\r\n");
      $rcv = fgets($connect, 1024);
      while (list($toKey, $toValue) = each($toArray)) {
      Ich gehe mal davon aus, daß Du die Fehlerprüfung nur für das Forum weggelassen hast.

      ja genau dort lag der Fehler, ich hatte die Fehlerüberprüfung einfach nicht richtig ausgewertet.

      Es ist nicht unbedingt hilfreich, den erklärenden Text, den der Mailserver hinter dem Fehlercode ausspuckt, abzuschneiden und durch "ich weiß nicht, was das bedeutet" zu ersetzen.

      Du hast Recht, ich war etwas frustriert keine Seite mit Erklärungen finden zu könne, bin aber im Laufe der Suche doch noch fündig geworden und dabei habe ich auch festgestellt, wie wichtig die MEldung danach ist

      Alles in allem solltest Du besser versuchen, die per Post zugestellten Fehlermeldungen an Dein Versandsystem zu geben anstatt den SMTP-Versand von vorne bis hinten selbst zu erledigen.

      wahrscheinlich richtig, ich werde es nochmals überarbeiten.
      Mein gefundener Fehler war ja auch das Übel für mail()

      Ich muss mich sowieso mit error-handling beschäftigen, da kann ich das gleich mit anpacken

      danke

      ciao
      romy

      --
      DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
      sh:( fo:| ch:? rl:( br:& va:| zu:) ss:| ls:[
      Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
      Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode