de.comp.lang.php.* FAQ

15.4. Windows: Wie funktioniert der Mailversand?

Keywords: Windows | Mail | Versand | Mailserver | SMTP

Antwort von Kristian Köhntopp

In Windows kann man nicht davon ausgehen, dass wie in Unix ein Mailer installiert ist, der Mail selber zustellen kann. Daher muss man dem Windows-System einen Rechner mitteilen, der einen Mailer installiert hat, den das Windows-System über TCP/IP mitbenutzen darf. Das kann der lokale Rechner localhost sein, falls auf dem eigenen System ein Mailserver installiert ist, aber auch jedes andere System, das für uns seinen Relay- und Spamschutz abgeschaltet hat.

Die Funktion mail() baut unter Windows eine TCP/IP-Verbindung zum Port 25 dieses in der Konfigurationsvariable SMTP festgelegten Systems auf und erzeugt mit dem oben gezeigten SMTP-Dialog eine Mail. Dabei wird die in der Konfigurationsvariablen sendmail_from festgelegte Absenderadresse verwendet.

Anders als in Unix hat man hier also nicht die Freiheit, den Absender oder Blindkopienempfänger in der Mailfunktion frei definieren zu können, weil der entfernte Mailer diese Daten von uns nicht annimmt oder bei der späteren Headerkorrektur wieder überschreibt.

Alternativ kann man die Arbeit der Mailfunktion auch manuell nachprogrammieren - dabei sollte man jedoch bedenken, dass ein SMTP-Server nicht jede Headerzeile so annimmt oder unverfälscht durchläßt, wie man sie ihm vorwirft! Der hier gezeigte Code ist sehr unzuverlässig, denn er hat keine richtige Fehlerprüfung.

$hdr  = "From: ab@send.er\r\n";
$hdr .= "To: em@pfaeng.er\r\n";
$hdr .= "Reply-To: devnull@send.er\r\n";
$hdr .= "Subject: Testmail\r\n";
$hdr .= "\r\n";

# Socket oeffnen.
$fp = fsockopen("mail.server.de", 25);
$result = fgets($fp, 1024);
if ($result+0 != 220)
	die("Statuscode falsch (service not ready?): $result");

# HELO
fputs($fp, "HELO mein.eigener.servername.de\r\n");
$result = fgets($fp, 1024);
if ($result+0 != 250)
	die("HELO Statuscode falsch: $result");

# MAIL FROM
fputs($fp, "MAIL FROM: ab@send.er\r\n");
$result = fgets($fp, 1024);
if ($result+0 != 250)
	die("MAIL FROM Statuscode falsch: $result");

# RCPT TO
fputs($fp, "RCPT TO: em@pfaeng.er\r\n");
$result = fgets($fp, 1024);
if ($result+0 != 250)
	die("RCPT TO: Statuscode falsch: $result");

# DATA
fputs($fp, "DATA\r\n");
$result = fgets($fp, 1024);
if ($result+0 != 354)
	die("DATA: Statuscode falsch: $result");

# Header senden
fputs($fp, $hdr);

# Text senden
fputs($fp, "Das ist nur eine Testnachricht.");

# Ende von DATA: CRLF . CRLF
fputs($fp, "\r\n.\r\n");
$result = fgets($fp, 1024);
if ($result+0 != 250)
	die("DATA(end): Statuscode falsch: $result");

# QUIT
fputs($fp, "QUIT\r\n");
$result = fgets($fp, 1024);
if ($result+0 != 221)
	die("QUIT: Statuscode falsch: $result");

# Verbindung schließen
fclose($fp);

Wer sich diesen Code nicht zutraut, kann auch die SMTP Klasse von Manuel Lemos verwenden. Sie verbirgt das manuelle Senden der Daten über den Socket gegenüber dem Programmierer und erzeugt auch Fehlermeldungen, wenn mal etwas nicht klappte. Beispiel:

<?php

  /* Funktionsklasse inkludieren. */
  include "smtp.php";

  $smtp = new smtp_class;
  $smtp->host_name=getenv("HOSTNAME");
  $smtp->localhost="localhost";
  $from = "name@".$smtp->host_name;
  $to = "da@irgendwo.de";

  $inhalt = "Inhalt der Mail";

  if ($smtp->SendMessage(
      $from,
      array($to),
      array("From: $from","To: $to","Subject: test"),
      $inhalt))
  {
     print "Mail wurde erfolgreich versandt.";
  }

?>

Valid HTML 4.01! Valid CSS!

15.4. Windows: Wie funktioniert der Mailversand?
http://www.php-faq.de/q/q-mail-windows.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team