Alexander (HH): Problem mit Mail senden über SMTP

Beitrag lesen

Moin Moin!

So hab mich jetzt einwenig durchgewühlt gelesen und so weiter und hab das ganze mal einwenig umgeschrieben und so funktioniert das ganze auch:

// Mail Funktion #######################################

$from = "@.de";
  $to = "@.de";
  $subject = "Newsletter";
  $message = "Das ist <b>ein</b> test!";

if(!$fp = fsockopen($smtpServer, $port, $errno, $errstr, $timeout))
    die("SMTP-Fehler: Verbindung zum Host (<i>".$smtpServer."</i>) fehlgeschalgen");

ok

fputs($fp, "HELO " . $smtpServer . "\r\n");

fputs hat einen Rückgabewert, den Du nicht prüfst.

Warum benutzt Du das alte HELO und nicht EHLO?

if(fgets($fp, 256) == "250")
           die("HELO SMTP-Fehler: Fehler bei der Verbindung zum Host (<i>".$smtpServer."</i>)");

Das funktioniert nur mit einem sehr speziellen Server:

  • SMTP-Antworten können aus mehr als einer Zeile bestehen.
  • SMTP-Antworten bestehen nicht nur aus dem Statuscode.
  • SMTP-Antwort-Zeilen können länger als 256 Zeichen sein.
    Lies bitte mal die RFCs, wenn Du unbedingt einen SMTP-Client selbst zusammenfrickeln willst.

fputs($fp, "AUTH LOGIN\r\n");

Rückgabewert nicht geprüft.

Woher weißt Du, dass der SMTP-Server das AUTH-Kommando in dieser Form verarbeiten kann?

Du hast die Antwort auf HELO/EHLO nicht ausreichend überprüft, in der die Fähigkeiten des Servers angegeben sind.

if(fgets($fp, 256) == "334")
         die("AUTH SMTP-Fehler: Fehler bei der Verbindung zum Host (<i>".$smtpServer."</i>)");

Antwort nicht ausreichend verarbeitet, s.o.

fputs($fp, base64_encode($smtpUser) . "\r\n");

Rückgabewert nicht geprüft.

if(fgets($fp, 256) == "334")
         die("SMTP-Fehler: Benutzername (<i>".$smtpUser."</i>) nicht akzeptiert");

Antwort nicht ausreichend verarbeitet, s.o.

fputs($fp, base64_encode($smtpPass) . "\r\n");
      if(fgets($fp, 256) == "235")
         die("SMTP-Fehler: Benutzername/Passwort nicht akzeptiert");

Nochmal

fputs($fp, "MAIL FROM: <" . $from . ">\r\n");
      if(fgets($fp, 256) == "250")
         die("FROM SMTP-Fehler: Das Email-Konto (<i>".$from."</i>) exitsiert nicht auf dem Host");

Und nochmal

fputs($fp, "RCPT TO: <$to>\r\n");

Hier prüfst Du gar nichts mehr.

fputs($fp, "DATA\r\n");

Hier fehlt wieder die Rückgabewert-Prüfung.

if(fgets($fp, 256) == "354")
      die("DATA SMTP-Fehler: Daten&uuml;bertragung konnte nicht gestartet werden.");

Und diese Antwort-Prüfung reicht wieder nicht aus.

//construct headers
  $headers  = "MIME-Version: 1.0\r\n";
  $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";

fputs($fp, "Subject: $subject\r\n");

fputs($fp, "To: $to\r\n");

fputs($fp, "$headers\r\n\r\n");

fputs($fp, "$message\r\n");

fputs($fp, ".\r\n");

Rückgabewerte ...

if(fgets($fp, 256) == "250")
      die("SMTP-Fehler: Email konnte nicht &uuml;bertragen werden");

Nicht ausreichend ...

fputs($fp, "QUIT\r\n");

Beides ...

fclose($fp);
// ######################################################

  
Alexander

-- 
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".