PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kein Abbruch bei Fehler



detonation997
22-05-2004, 01:00
Hallo!

Ich lasse durch ein PHP-Script Emails versenden.
Dazu öffne ich ein Socket zum Port 25 meines Mailservers. Die SMTP-Befehle schicke ich dann per "fputs" heinein.

Probleme gibts dann, wenn ein Mail nicht erfolgreich versendet werden kann. Die Ausführung des Scripts wird abgebrochen.

Nun wärs mir recht, dass das eben nicht so ist, und ich auf das "verlorengegangene" Mail (das Problem ist in den meisten Fällen eh auf eine nicht existente E-Mailadresse zurückzuführen) verzichten kann, und das Script bis zum Ende ausgeführt werden soll.

In Perl hätte ich das Ganze durch ein/mehrere "fork()" lösen lassen. In PHP gibts lt. Doku den Befehl ja leider nicht :(

Danke für alle Hinweise!
mfg Rainer

Pingu
22-05-2004, 06:58
siehe manual: http://www.php.net/manual/de/ref.errorfunc.php

Also entweder den Abbruch bei Fehler allg. abschalten oder nur für die jeweilige Funktion.

Pingu

detonation997
22-05-2004, 20:32
Hi!

Danke für den Hinweis!
Wie aber kann ich einen Fatal-Error, der die Ausführung des Scripts zur Folge hat, unterbinden?

So siehts bei mir aus:

Fatal error: Maximum execution time of 30 seconds exceeded in /var/www/sendmail.php on line 11

"line 11" ist die Zeile mit "helo" (erkennt man nicht, da ich den html-code weggelassen habe).

Der Code dazu:

<?php
&nbsp;&nbsp;$smtp_connect = fsockopen("127.0.0.1",25,$errno,$errstr,30) or die ("Could not talk to my internal smtp server!");
&nbsp;&nbsp;for($i=0; $i<100; $i += 1)
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;$rcv = fgets($smtp_connect,1024);
&nbsp;&nbsp;&nbsp;&nbsp;fputs($smtp_connect, "helo xxx\r\n") or echo "helo<br>\n";
&nbsp;&nbsp;&nbsp;&nbsp;$rcv = fgets($smtp_connect,1024);
&nbsp;&nbsp;&nbsp;&nbsp;fputs($smtp_connect, "mail from: xxx@xxx.net\r\n");
&nbsp;&nbsp;&nbsp;&nbsp;$rcv = fgets($smtp_connect,1024);
&nbsp;&nbsp;&nbsp;&nbsp;fputs($smtp_connect, "rcpt to: gibtsnicht@xxx.net\r\n");
&nbsp;&nbsp;&nbsp;&nbsp;$rcv = fgets($smtp_connect,1024);
&nbsp;&nbsp;&nbsp;&nbsp;fputs($smtp_connect, "data\r\n");
&nbsp;&nbsp;&nbsp;&nbsp;$rcv = fgets($smtp_connect,1024);
&nbsp;&nbsp;&nbsp;&nbsp;fputs($smtp_connect, "subject:test\r\n");
&nbsp;&nbsp;&nbsp;&nbsp;$rcv = fgets($smtp_connect,1024);
&nbsp;&nbsp;&nbsp;&nbsp;fputs($smtp_connect, "test\n");
&nbsp;&nbsp;&nbsp;&nbsp;$rcv = fgets($smtp_connect,1024);
&nbsp;&nbsp;&nbsp;&nbsp;fputs($smtp_connect, ".\r\n");
&nbsp;&nbsp;&nbsp;&nbsp;$rcv = fgets($smtp_connect,1024);
&nbsp;&nbsp;&nbsp;&nbsp;fputs($smtp_connect, "RSET\r\n");
&nbsp;&nbsp;&nbsp;&nbsp;$rcv = fgets($smtp_connect,1024);
&nbsp;&nbsp;&nbsp;&nbsp;echo $i, "<br>\n";
&nbsp;&nbsp;}
&nbsp;&nbsp;fputs ($smtp_connect, "QUIT\r\n");
&nbsp;&nbsp;$rcv = fgets($smtp_connect,1024);
&nbsp;&nbsp;fclose($smtp_connect);
?>

Das Mailserverlog-File (postfix 2.x):
============================
ay 22 20:31:59 dlserver postfix/smtpd[29217]: B395B183C4: reject: RCPT from dlserver[127.0.0.1]: 450 <gibtsnicht@xxx.net>: User unknown in local recipient table; from=<xxx@xxx.net> to=<gibtsnicht@xxx.net> proto=SMTP helo=<xxx>
May 22 20:33:44 dlserver postfix/smtpd[29217]: too many errors after DATA from dlserver[127.0.0.1]
May 22 20:33:44 dlserver postfix/smtpd[29217]: disconnect from dlserver[127.0.0.1]

Danke für jeden Hinweis!
Den Namen der Domain hab' ich durch "xxx" ersetzt.
mfg Rainer

undefined
22-05-2004, 21:20
mit einem "ed"

$smtp_connect = @fsockopen("127.565.0.1",25,$errno,$errstr,30);
if (!$smtp_connect)
echo "Ein Fehler ist aufgetreten";

Pingu
22-05-2004, 21:25
Original geschrieben von detonation997
Fatal error: Maximum execution time of 30 seconds exceeded in /var/www/sendmail.php on line 11

Ach das. Das hättest Du schon dazu sagen müssen. Denn Zeitüberschreitung ist etwas anderes.
Eine Möglichkeit wäre die, die von undefined genannt wurde. Eine andere wäre, die maximale erlaubte Zeit hoch zu setzten (schlechter Ansatz - da es dann halt später passieren wird).
Oder meines erachtens die beste Variante: Die interne Funktion mail() zu verwenden. Dazu muß natürlich der MTA richtig eingerichtet sein - auf dem lokalen Rechner.

Pingu