15.4. Windows: Wie funktioniert der Mailversand?Antwort von Kristian KöhntoppIn 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."; } ?> |
||
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 |