Problem mit der mail()-Funktion
verona
- php
Hallo liebes Forum,
nachdem ich mich jetzt eine Weile mit MIME Mails und PHP beschäftigt haben, finde ich immer noch keine Lösung für mein Problem. Ich habe viele Seiten gefunden, aber alle bringen mir nicht wirklich einen Antwort. Also versuche ich es mal hier.
Ich benutzte die PHP-Funktion mail(), die wie folgt aufgebaut ist:
mail($empfaengeradresse,$betreff,$nachricht,$headers);
Gleich mal vorneweg. Ich versuche mich in multipart/-Mails und da habe ich schon ein Verständnisproblem. Mit dem Aufbau der Funktion mail() bin ich doch irgendwann gezwungen einen Teil der Nachricht in den $headers zu schreiben oder einen Teil der Headers in $nachricht, oder?! Ich hoffe ihr versteht.
$headers -> z.B. Content Type multipart/alternative
$headers -> z.B. text/plain
$nachricht -> Hallo blablabla
$headers -> z.B. text/html
$nachricht -> <b>Hallo blablabla</b>
Wie geht es denn richtig? Meine Mails, die ich damit sende, zeigen mir immer den HTML-Teil als plain, also mit allen Tags.
Gruß Vero
Hi,
Ich versuche mich in multipart/-Mails und da habe ich schon ein Verständnisproblem. Mit dem Aufbau der Funktion mail() bin ich doch irgendwann gezwungen einen Teil der Nachricht in den $headers zu schreiben oder einen Teil der Headers in $nachricht, oder?!
nein. Es gibt nur einen Header, welcher sagt, dass der Body der Mail, also die eigentliche Nachricht, vom Client so interpretiert werden soll, dass dort weitere Header stehen. Diese stehen jedoch schlicht und ergreifend innerhalb von $nachricht.
Cheatah
Hallo Cheatah,
dann sollte das doch eigentlich stimmen, oder?
$boundary_mixed = "ME-" . strtoupper(md5(uniqid(time())));
$boundary_related = "ME-" . strtoupper(md5(uniqid(time())));
$boundary_alternative = "ME-" . strtoupper(md5(uniqid(time())));
$headers = "From: "".addslashes($absendername)."" <".$absendermail.">\r\n";
$headers .= "Reply-To: ".$absendermail."\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "X-Priority: 3\r\n";
$headers .= "X-Mailer: PHP Mailskript / ".phpversion()."\r\n";
$headers .= "Content-Type: multipart/mixed; boundary="" . $boundary_mixed . ""\r\n";
$headers .= "Content-Transfer-Encoding: 7bit\r\n";
$headers .= "Diesen Teil der E-Mail sollten Sie nicht sehen.\r\n";
$headers .= "Wenn Sie das hier lesen, sollten Sie Ihren E-Mail-Client\r\n";
$headers .= "in einen MIME-kompatiblen E-Mail-Client tauschen.\r\n";
$headers .= "\r\n";
$headers .= "This part of the E-mail should never be seen.\r\n";
$headers .= "If you are reading this, consider upgrading your e-mail client\r\n";
$headers .= "to a MIME-compatible e-mail client.\r\n";
$headers .= "--" . $boundary_mixed . "\r\n";
// $nachricht = "Content-Type: multipart/related; boundary="" . $boundary_related . ""\r\n";
// $nachricht .= "--" . $boundary_related . "\r\n";
$nachricht = "Content-Type: multipart/alternative; boundary="" . $boundary_alternative . ""\r\n";
$nachricht .= "--" . $boundary_alternative . "\r\n";
$nachricht .= "Content-Type: text/plain; charset=iso-8859-1\r\n";
$nachricht .= "Content-Transfer-Encoding: quoted-printable\r\n";
$nachricht .= join('',file($vorlage_text));
$nachricht .= "--" . $boundary_alternative . "\r\n";
$nachricht .= "Content-Type: text/html; charset=iso-8859-1\r\n";
$nachricht .= "Content-Transfer-Encoding: 8bit\r\n";
$nachricht .= join('',file($vorlage_html));
$nachricht .= "--" . $boundary_alternative . "--\r\n";
// $nachricht .= "--" . $boundary_related . "\r\n";
// $nachricht .= "Content-Type: image/jpeg\r\n";
// $nachricht .= "Content-Transfer-Encoding: base64\r\n";
// $nachricht .= "0.gif";
// $nachricht .= "--" . $boundary_related . "--\r\n";
$nachricht .= "--" . $boundary_mixed . "--\r\n";
mail($empfaengermail,$betreff,$nachricht,$headers);
Tut es aber nicht. Der HTML-Teil wird immer mit allen TAGS gezeigt, und ein Teil des Text-Teil vorneweg?! Verstehe ich nicht.
Hi,
dann sollte das doch eigentlich stimmen, oder?
in welchen Mail-Clients liefert es die gewünschten Ergebnisse?
$headers .= "Diesen Teil der E-Mail sollten Sie nicht sehen.\r\n";
Das ist kein gültiger Mail-Header.
$headers .= "Wenn Sie das hier lesen, sollten Sie Ihren E-Mail-Client\r\n";
$headers .= "in einen MIME-kompatiblen E-Mail-Client tauschen.\r\n";
Nein. Es wäre völlig korrekt, wenn der Mail-Client dies im Zusammenhang mit einer Fehlermeldung anzeigt.
$headers .= "\r\n";
Spätestens hiermit ist die Variable $headers der falsche Ort.
$headers .= "This part of the E-mail should never be seen.\r\n";
Dies ist bereits Teil des Bodies.
Tut es aber nicht. Der HTML-Teil wird immer mit allen TAGS gezeigt, und ein Teil des Text-Teil vorneweg?! Verstehe ich nicht.
Warum benutzt Du unterschiedliche Boundaries?
Cheatah
Das ist jetzt das bereinigte Skript. Aber alles was ich geliefert bekomme ist Müll. Die Mail beginnt mit einer Leerzeile und liefert dann das hier.
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Dann den Inhalt von $vorlage_text
text- Aber Hallo
Den Inhalt von $boundary
usw...
_____________________________________________________________________________________________
$boundary = "ME-" . strtoupper(md5(uniqid(time())));
$headers = "From: "".addslashes($absendername)."" <".$absendermail.">\r\n";
$headers .= "Reply-To: ".$absendermail."\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "X-Priority: 3\r\n";
$headers .= "X-Mailer: PHP Mailskript / " . phpversion() . "\r\n";
$headers .= "Content-Type: multipart/alternative; boundary="" . $boundary . ""\r\n";
$headers .= "--" . $boundary . "\r\n";
$nachricht .= "Content-Type: text/plain; charset=iso-8859-1\r\n";
$nachricht .= "Content-Transfer-Encoding: quoted-printable\r\n";
$nachricht .= join('',file($vorlage_text));
$nachricht .= "text- Aber Hallo";
$nachricht .= "--" . $boundary . "\r\n";
$nachricht .= "Content-Type: text/html; charset=iso-8859-1\r\n";
$nachricht .= "Content-Transfer-Encoding: 8bit\r\n";
$nachricht .= join('',file($vorlage_html));
$nachricht .= "HTML <b>Aber Hallo<b>";
$nachricht .= "--" . $boundary . "--\r\n";
mail($empfaengermail,$betreff,$nachricht,$headers);
Hi,
Aber alles was ich geliefert bekomme ist Müll.
vergleiche den Quellcode(!) der von Dir generierten Mail mit einer ähnlichen, die von einem anderen Programm generiert wurde und die gewünschten Ergebnisse liefert. Versuche (erst) dann herauszufinden, wo der Fehler in Deinem PHP-Code liegt.
Cheatah
Wie komme ich denn an so einen Quellcode?
Halihallo verona
Wie komme ich denn an so einen Quellcode?
http://forum.de.selfhtml.org/archiv/2003/5/46481/#m253584, warum erst jetzt das
Interesse? - Nun gut...
(Fast) jeder Mailclient hat eine Funktion "Quelltext ansehen" oder ähnlich. Welchen du
benutzt hast du uns nicht mitgeteilt, somit auch keine hilfreiche Antwort.
Viele Grüsse
Philipp
Ach Phillip,
darum geht es doch gar nicht. Welcher Mail-Client? Das ist doch zweitrangig. Das erste mal hatte ich noch versucht einen Anhang an die Mail zu hängen. Das ist erledigt. Und um Deine Frage mit dem Client zu beantworten. Alle, die es gibt. Outlook, Outlook Express, Tobit, David, Netscape, TheBat, und und und...
Und den Quellcode den ich sehe, ist der einer HTML-Seite. Bei Outlook kann ich mir unter den Options aber noch den Head anschauen. Soll ich den auch mal schicken?
Return-Path: user@domain.tld
Delivered-To: empfaenger@domain.tld
Received: (qmail 8445 invoked from network); 15 May 2003 10:54:00 -0000
Received: from unknown (HELO aurora.ispgateway.de) ([62.67.200.30]) (envelope-sender user@domain.tld)
by sleet.ispgateway.de (qmail-ldap-1.03) with SMTP
for empfaenger@domain.tld; 15 May 2003 10:54:00 -0000
Received: (qmail 30125 invoked by uid 0); 15 May 2003 10:54:00 -0000
Received: from unknown (HELO aurora.ispgateway.de) (127.0.0.1)
by localhost with SMTP; 15 May 2003 10:54:00 -0000
Received: (from u12345@localhost)
by aurora.ispgateway.de (8.12.8/8.12.8/Submit) id h4FArvsG030118;
Thu, 15 May 2003 12:53:57 +0200
Date: Thu, 15 May 2003 12:53:57 +0200
Message-Id: 200305151011.h4FArvsG030118@aurora.ispgateway.de
To: empfaenger@domain.tld
Subject: Betreff newsletter
From: "Firma 1" absender@domain.tld
Reply-To: absender@domain.tld
MIME-Version: 1.0
X-Priority: 3
X-Mailer: PHP Mailskript / 4.2.3
Content-Type: multipart/alternative; boundary="------------ME-F54D9F74915FA8E4E3FD9EAD22DE92C2"
Was mich hierbei wundert, ist der Unterschied zwischen user@domain.tld und absender@domain.tld! Woher kommt bitteschön denn der user@domain.tld? Den habe ich nicht angegeben. Kommt wohl vom ISP, was?
Halihallo verona
darum geht es doch gar nicht. Welcher Mail-Client? Das ist doch zweitrangig.
Ja, es ist zweitrangig, deshalb habe ich dir die Wahl überlassen.
Es geht mir und wohl auch Cheatah darum, dass du dir selber eine E-Mail des gewünschten
Formates zusendest und dann den Quelltext ansiehst. Denn wenn du dies tust, weisst du,
wie es in PHP umgesetzt werden muss, andernfalls wäre ich natürlich der letzte, der dich
vom RFC-lesen abhält.
Und den Quellcode den ich sehe, ist der einer HTML-Seite. Bei Outlook kann ich mir unter den Options aber noch den Head anschauen. Soll ich den auch mal schicken?
Du musst deinen Mailclient veranlassen den _gesamten_ Quelltext anzuzeigen. Mit Outlook
Express geht dies über Eigenschaften->Details->Quelltext. Dort siehst du, was man dem
Mailclient geben muss, sodass er das Mail so darstellt, wie du es möchtest.
Was mich hierbei wundert, ist der Unterschied zwischen user@domain.tld und absender@domain.tld! Woher kommt bitteschön denn der user@domain.tld? Den habe ich nicht angegeben. Kommt wohl vom ISP, was?
Möglich. Return-Path ist oftmals gleich des From-Headers. Er spezifiziert lediglich die
Empfängeradresse, wenn das E-Mail z. B. nicht zugestellt werden kann. Aber das der ISP
da etwas ändert glaube ich weniger.
Viele Grüsse
Philipp
Hallo Phillip,
danke nochmals. Nächste Woche kommt ein Bekannter und zeigt mir das anhand von Javaklassen. Hab nie was damit zu tun gehabt, aber MIME ist MIME, was?! :-)
Vero
Hallo Verona,
Warum machst Du Dir das Leben eigentlich schwer? Es gibt der PEAR-Klasse Mail_Mime, die das Behandeln von MIME-Mails Dir abnimmt:
http://pear.php.net/manual/de/core.mail.mime.php
Viele Grüße,
Christian