[PHP] PHP-Funktion: mail()

Azador

PHP Bastler
ID: 108964
L
9 Mai 2006
70
4
Hi allerseits!

Hab nun auch den Weg in das neue Forum gefunden und belästige alle auch gleich mal mit einem kleinen Problemchen von mir.
Ich hab ein PHP Skript, das einen neuen User anmeldet und in eine Datenbank schreibt. Gleichzeitig soll der User an die angegebene Adresse eine E-Mail bekommen, in der sein Loginname und sein zufälliges Passwort steht.

An sich funktioniert auch alles, nur bricht der sich bei den Headern immer einen ab (würde die Mail natürlich gern in html-format schicken).

Die Ausgabe ist:
Content-Transfer-Encoding: 8bit\r\n Message-Id: <[email protected]> Date: Tue, 9 May 2006 12:10:02 +0200 (CEST)

Hallo!

Login-Name: Test
Passwort: 123456


Der Code ist:


PHP:
switch...
	case 'neuer Spieler': 
		$betreff = 'Willkommen!';
		$text = '
<html>
<head>
<title>Willkommen!</title>
<style type="text/css">

	body {
	font-family: Arial, Helvetica, sans-serif;
    background-color: '.$hintergrund.';
	color: '.$textfarbe.';
	}
</style>

</head>
<body>

	<table align="center" width="100%">
		<tr>
			<td colspan="2" width="100%" align="center">
                                       Hallo!
			<br />
			<br />
			<br />
			</td>
		</tr>
		
		<tr>
			<td width="50%" align="left">
			Login-Name:
			</td>
			<td width="50%" align="left">
			'.$_REQUEST['name'].'
			</td>
		</tr>
		
		<tr>
			<td width="50%" align="left">
			Passwort:	
			</td>
			<td width="50%" align="left">
			'.$zufpw.'
			</td>
		</tr>
		

		<tr>
			<td colspan="2" width="100%" align="left">
			<br />
                                       Mehr Text...
			</td>
		</tr>		
		</table>
	</body>
</html>';

		$header  = 'From:MyHomepage<[email protected]>'."\r\n";	
		$header .= 'Content-type:text/html'."\r\n";	
		$header .= 'Content-Transfer-Encoding: 8bit\r\n';
				
		mail($empfaenger, $betreff, $text, $header);

		
		break;

Vielleicht beachte ich grundlegende Sachen wie Reihenfogle der Header nicht - weiß jemand Rat? Danke!
 
Ich löse das so, vieleicht hilft es dir ja auch.

PHP:
$message = "

<body text='black' link='black' alink='black' vlink='black'>
Hallo Test Demo,
<br><br>
Sie erhalten diese Mail aufgrund Ihrer Mitgliedschaft bei Demo.
<br>
        <table border='0' cellpadding='0' cellspacing='2' width='550'>
                <tr>
                        <td>
                                <div align='left'>
                                        </div>
                        </td>
                </tr>
                <tr height='10'>
                        <td height='10'></td>
                </tr>
                <tr>
                        <td><font face='Verdana,Helvetica,Geneva,Swiss,SunSans-Regular' size='1'>Dieses ist der Paidmailtext. Laber Laber Laber</font>
                                <p><br>
                                                        <br>
                                                        <br>
                                                </b></font></p>
                                <div align='center'>

                                </div>
                        </td>
                </tr>
        </table>
</body>

";
$xtra    = "From: demo <[email protected]>\n";
$xtra   .= "X-Priority: 5\n";
$xtra   .= "Return-Path: [email protected]\n";
$xtra   .= "Content-Type: text/html";

mail($empf,betreff,$message,$xtra);
 
zusatzfrage an die php-meister hier,dann muss ich nicht extra nen thread aufmachen:

wenn ich in ner schleife die mail()-fkt benutze und damit an 300 emails ne mail verschicke (newsletter), kann ich da irgendwie probleme bekommen?

danke, peace, iMrE
 
Bei 300 geht das noch, obwohl ich auch hier die Mails in Blöcken zu 50 Mails oder weniger verschicken würden.
 
groening schrieb:
Bei 300 geht das noch, obwohl ich auch hier die Mails in Blöcken zu 50 Mails oder weniger verschicken würden.

warum in blöcken? wieso gerade "á 50"?
wie blocken? per sleep()?

danke schonmal :)

peace, iMrE
 
Die Frage würd ich glaube ich mal deinem Hoster schicken. Ich meine mich zu erinnern, dass manche Anbieter Begrenzungen eingeführt haben, wieviel Mails auf einen Schlag versenden werden können (als Spamschutz). Halte ich zwar nur für begrenzt sinnvoll, denn wer spammen will kann das problemlos trotzdem, aber man muss sich halt danach richten, falls so eine Begrenzung vorhanden ist.
 
Talion schrieb:
Die Frage würd ich glaube ich mal deinem Hoster schicken. Ich meine mich zu erinnern, dass manche Anbieter Begrenzungen eingeführt haben, wieviel Mails auf einen Schlag versenden werden können (als Spamschutz). Halte ich zwar nur für begrenzt sinnvoll, denn wer spammen will kann das problemlos trotzdem, aber man muss sich halt danach richten, falls so eine Begrenzung vorhanden ist.

hoster: puretec/1&1.
okay werd mal die fragen.

die definition von "auf einmal" wäre dann auch interessant. denn ich verschick die ja in ner schleife und die dauert ja paar ms ;-)

danke, peace, iMrE
 
Ich kopier Dir mal einen mail()-Befehl, der auf jeden Fall HTML-Mails verschickt aus einem meiner Scripte. - Ich hatte früher nämlich genau dasselbe Problem, und hab's dann etwas umgebastelt:

mail(trim($email), "$betreff", "<b>$mailtext</b>", "MIME-Version: 1.0\r\n" . "Content-type: text/html; charset=iso-8859-1\r\n" . "From: " . trim($seitentitel) . " <" . trim($mailaddi) . ">\r\n");
Mußte Dir mit den Variablen nur auf Deine Bedürfnisse anpassen. Aber das ist ja wohl weniger das Problem.

Bezüglich der 300 Mails am Stück: Mach Dir da mal keinen Kopp drum, und F*** for Verzögerungschleife. - Draufballern und gut is. - Der Versand von den Mails dauert ja auch so schon lang genug.

Wenn die Empfängerzahl zu groß wird kannst Du höchstens ein anderes Problem bekommen. Nämlich wenn Deine Mail-Schleife 20-30 Minuten am ackern ist und genau in dieser Zeit Deine Internetleitung zusammenbricht, z.B. wegen automatischer Trennung nach 24h. Dann haben die ersten User die Mail schon bekommen, und die letzten erhalten sie nicht mehr, weil die Schleife nach neuem Verbindungsaufbau nicht fortgeführt werden kann.

Aber bei 300 Usern hast Du ja einen Versand auf jeden Fall <1 Minute, da ist dieses Risiko überschaubar.
 
YetiF schrieb:
Wenn die Empfängerzahl zu groß wird kannst Du höchstens ein anderes Problem bekommen. Nämlich wenn Deine Mail-Schleife 20-30 Minuten am ackern ist und genau in dieser Zeit Deine Internetleitung zusammenbricht, z.B. wegen automatischer Trennung nach 24h. Dann haben die ersten User die Mail schon bekommen, und die letzten erhalten sie nicht mehr, weil die Schleife nach neuem Verbindungsaufbau nicht fortgeführt werden kann.
https://de3.php.net/ignore_user_abort ;)

Man muss nur dafür sorgen, dasses keinen Timeout nach den stardardmäßigen 30 Sekunden gibt. Drum empfiehlt es sich pro Scriptaufruf nur 50 Mails schicken zu lassen und dann lieber automatisch zum nächsten Schub redirekten zu lassen.
 
um mal zu meinem Problem zurückzukommen ^^

ich hab das jetzt mal in YetiF's Vorschlag geändert:

PHP:
$header  = "MIME-Version: 1.0\r\n";	
$header .= "Content-type: text/html; charset=iso-8859-1\r\n";	
$header .= "From: MyPage <[email protected]>\r\n";	
//$header .= 'Content-Transfer-Encoding: 8bit\r\n';
				
mail($empfaenger, $betreff, $text, $header);

Das Problem hat sich dadaurch jedoch eher verschlechtert, da nun die Mail als Text ausgegen wird, also der komplette HTML Code sichtbar ist und auch der Absender vom Mailprogramm nun als "Unknown" angegeben wird. Die Mail beginnt jetzt mit:

Content-type: text/html; charset=iso-8859-1

From: MyPage <[email protected]>
Message-Id: <[email protected]>
Date: Tue, 9 May 2006 16:11:50 +0200 (CEST)




<html>

<head>

<title>

Könnte mal jemand kurz zusammenfassen was bei der HEaderangabe zu beachten ist? Ich seh da jetzt keine Gesetzmäßigkeit. Ich hab vorher schon per PHP Mails verschickt, die auch immer vernünftig angekommen sind. Und ich habe jene Skripte als Grundlage für dies hier genommen. Was ist hier falsch? Liegt das Problem vielleicht auf Empfänger-Mailproviderseite? Ich schick die Testmails an eine GMX.de-Adresse.

Hilfe! :-?
 
Das Problem ist, dass jeder Server ein etwas andere Variante von sendmail installiert hat, also des Servermoduls das die Mails entgegen nimmt ("POP3 für Scripte").

Wenn Du dasselbe Script auf einem anderen Server laufen läßt kann es wunderbar klappen.

Nur deswegen den Server zu wechseln wäre natürlich verkehrt. Deshalb lieber so lange am mail() Befehl rumbasteln, bis er funzt!
 
ABC schrieb:
Das ist alles hier Quatsch!

Ihr könnt 100.0000.00000000000 Mails versenden, in dem ihr nur eine einzige Mail absendet! Das funktioniert immer tadellos.
Ja, ist absolut richtig. Hat nur DEN Nachteil, dass dann 10 Fantasilliarden Mal haargenau derselbe Mailtext verschickt wird.

Wenn Du in den Mails die User z.B. individuell ansprechen möchtest (Hallo $username), oder die Mails z.B. individuelle Bestätigungslinks haben, dann mußt Du jede Mail einzeln in einer Schleife an sendmail übergeben.

Also bitte erstmal über ein Problem von mehreren Seiten nachdenken, bevor man andere des Quatsch laberns beschuldigt, danke!
 


Mitm array nicht!

Du kannst ebenso ein array für empfänger und text anlegen. Das geht alles. Nun wird der Mailserver nicht x1000 Mailbefehle bekommen, sondern nur einen. Das heist, er weis mit einem Befehl, ich muss nun die Mail (Mails) an all die Empfänger senden.

Während mit einer Schleife, man den Mailserver nur überlastet.

PHP:
<?php
// Empfaengerliste
$empfaenger = array(
        "[email protected]",
        "[email protected]",
        "[email protected]"
        );

$text = array(
        "Hallo Susi",
        "Hallo Bernd",
        "Hallo Alf"
        );

// BCC-Erzeugen
foreach ($empfaenger as $key => $email) {
    $bcc .= "Bcc: $email\r\n";
}

// Mail samt BCC-Empfänger versenden
mail(
    "[email protected]",
    "Newsletter",
    $text;
    $bcc
    );

?>
 
Zuletzt bearbeitet:
ABC schrieb:
Hallo

Das ist alles hier Quatsch!

Ihr könnt 100.0000.00000000000 Mails versenden, in dem ihr nur eine einzige Mail absendet! Das funktioniert immer tadellos.

PHP:
<?php
mail('[email protected], [email protected], [email protected]', 'Betreff', 'Und hier steht die Nachricht!');
?>

Und das ist wohl der größte Quatsch. Funktioniert zwar, bringt dir aber auch nur wirklich etwas wenn du immer den exakt selben Inhalt hast. Ich denke das wird das hier besprochene Problem aber nicht lösen.
 
YetiF schrieb:
Nur deswegen den Server zu wechseln wäre natürlich verkehrt. Deshalb lieber so lange am mail() Befehl rumbasteln, bis er funzt!

Also ist das alles? *enttäuscht*
Einfach solange rumprobieren bis es geht? Find ich irgendwie - naja - billig.

Was soll ich denn variieren? Die Reihenfolge der Header?
 
Azador schrieb:
Was soll ich denn variieren? Die Reihenfolge der Header?
Guck mal in der entsprechenden RFC, wie denn die Header richtig formatiert gehören. Auswendig weiß ich jetzt auch ned, was da falsch sein könnte.
 
Azador schrieb:
Also ist das alles? *enttäuscht*
Einfach solange rumprobieren bis es geht? Find ich irgendwie - naja - billig.

Was soll ich denn variieren? Die Reihenfolge der Header?

Sorry aber die Leute hier können auch nur Anregungen geben. Wenn du gar nicht klarkommst musst du jemanden beauftragen. Das mit dem probieren macht durchaus Sinn ;) . Ich habe so alles gelernt was ich heute über PHP weiß.
 
Zuletzt bearbeitet:
War ja nicht so gemeint ^^ Ich war halt von Anfang von PHP so begeistert, eben weil alles standardisiert und DAU-sicher schien - keinerlei Clientvorraussetzungen, keine Browserabhängigkeiten, keine fehlenden Javabibliotheken, einfach nur pures html, das serverseitig ausgewertet beim Client ankommt, fertig.
(Nebenbei, das Skript mit dem alles funktioniert, läuft tatsächlich bei nem anderen Anbieter. )

Und jetzt zerstört Ihr diese Illusion, indem Ihr mir erzählt, dass unterschiedliche Server so extrem voneinander abweichende sendmail versionen betreiben können, dass es so doch gravierende Probleme geben kann. Ich mein, versteht meinen Standpunkt mal - als nächstes erzählt Ihr mir womöglich, dass es den Weihnachtsmann in Wirklichkeit gar nicht gibt. :naughty:

Werd mal zu der entsprechenden RFC recherchieren und mal gucken, was ich durch testen hinkriege - nur um das nochmal deutlich zu machen: Ich erwarte hier keine fertigen Lösungen aus dem Hut gezaubert zu bekommen und habe immer selbst ausprobiert und gebastelt, so ist das ja nun nicht. :D

Ich bin Euch auf jeden Fall dankbar für die ganzen Anregungen und Tipps!!!
 
Azador schrieb:
War ja nicht so gemeint ^^ Ich war halt von Anfang von PHP so begeistert, eben weil alles standardisiert und DAU-sicher schien - keinerlei Clientvorraussetzungen, keine Browserabhängigkeiten, keine fehlenden Javabibliotheken, einfach nur pures html, das serverseitig ausgewertet beim Client ankommt, fertig.
(Nebenbei, das Skript mit dem alles funktioniert, läuft tatsächlich bei nem anderen Anbieter. )

Und jetzt zerstört Ihr diese Illusion, indem Ihr mir erzählt, dass unterschiedliche Server so extrem voneinander abweichende sendmail versionen betreiben können, dass es so doch gravierende Probleme geben kann. Ich mein, versteht meinen Standpunkt mal - als nächstes erzählt Ihr mir womöglich, dass es den Weihnachtsmann in Wirklichkeit gar nicht gibt. :naughty:

Werd mal zu der entsprechenden RFC recherchieren und mal gucken, was ich durch testen hinkriege - nur um das nochmal deutlich zu machen: Ich erwarte hier keine fertigen Lösungen aus dem Hut gezaubert zu bekommen und habe immer selbst ausprobiert und gebastelt, so ist das ja nun nicht. :D

Ich bin Euch auf jeden Fall dankbar für die ganzen Anregungen und Tipps!!!

Die Abweichungen sind meistens nur gering. Mit ein wenig Erfahrung bekommst du jedes PHP-Script auf jedem Server zu laufen. Oftmals sind es auch die Hoster die irgendwelche Begrenzungen ect setzen oder einfach bestimmte Module nicht Installieren. Das sollte dich aber nicht davon abhalten PHP zu lernen.

Besorge dir doch mal kleinere Programme und schau dir die Codes an. Wenn du die Logik einmal verstanden hast ist der Rest echt kein Problem. Wenn du eine Empfehlung für Webspace mit PHP, der zum Entwickeln geeignet ist brauchst kann dir hier sicher jemand welche nennen.

Ich fang mal an mit all-inkl.de

Da darfst du zwar keine Mailtauscher ect betreiben, aber zum entwickeln ist der Webspace perfekt. Der Support bei Problemen war auch immer einwandfrei.