HTML-Mail mit php mail() verschicken
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abschneiden
absender
aufruf
code
date
eintrag
email
fehler
funktionieren
header
input
message
mime
record
sender
test
text
transfer
type
url
-
Guten Tag,
da ich es einfach nicht hinbekomme ein HTML-Mail zu verschicken, hoffe ich hier Rat zu finden.
Ich habe eine Mailer-Klasse wie folgt geschrieben:
<?php class MyMailer { // Standard Konstruktor wird verwendet // Relevante Daten private $sender = 'Dominik Dechamps <malanox@jumping-bayreuth.de>'; private $recipients = ''; private $subject = ''; private $content = ''; private $ishtml = false; public function setHTML($input) { $this->ishtml=$input; } public function setRecipients($input) { $this->recipients = $input; } public function setSubject($input) { $this->subject = $input; } public function setContent($input) { $this->content = $input; } public function send() { if($this->sender != '' && $this->recipients != '' && $this->content != '' && $this->subject != "") if($this->ishtml) return mail($this->recipients, $this->subject, $this->content, 'From: '.$this->sender."\nContent-Type: text/html\nContent-Transfer-Encoding: 8bit"); else return mail($this->recipients, $this->subject, $this->content, 'From: '.$this->sender); else return false; } } ?>
Und mein Versuch eine Mail zu versenden sieht so aus:
<?php require_once("_private/MyMailer.class.php"); $mailer = new MyMailer(); $content = '<html><head><title>Terminänderung</title></head><body>'; // <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> $content .= '<p>Hallo,<br>ein eingetragener Termin wurde geändert!<br>Die alten Termindaten waren:<br>'; $content .= '<table><tr><td>Veranstaltung:</td><td>'."Ä".'</td></tr><br>'; $content .= '<tr><td>Datum und Uhrzeit:</td><td>'."ä".'</td></tr><br>'; $content .= '<tr><td>Ort:</td><td>'."ß".'</td></tr></table><br><br>'; $content .= '<table><tr><td>Veranstaltung:</td><td>'."&".'</td></tr><br>'; $content .= '<tr><td>Datum und Uhrzeit:</td><td>'."°".'</td></tr><br>'; $content .= '<tr><td>Ort:</td><td>'."---".'</td></tr></table><br><br>'; $content .= 'Mit freundlichen Grüßen,\n\tD.Dechamps\n\nPS: Diese eMail wurde maschinell generiert und diente nur zur Testzwecken!</p></body></html>'; $mailer->setContent($content); $mailer->setHTML(true); $mailer->setRecipients('Dechi <dechi19@gmx.de>'); $mailer->setSubject('Terminänderung'); $mailer->send(); ?>
Die eMail wird auch versendet, aber ich sehe den HTML-Code und keine formatierte Mail.
Anmerkung zu'From: '.$this->sender."\nContent-Type: text/html\nContent-Transfer-Encoding: 8bit"
Wenn ich nur mit \n umbreche, habe ich in der Mail selbst keinen "Kopf" stehen!
Wenn ich aber mit \r\n umbreche, steht folgendes noch mit in der eMail
Content-Transfer-Encoding: 8bit
Message-Id: <20120105133015.982AF66DF0@web2.lima-city.de>
Date: Thu, 5 Jan 2012 14:30:15 +0100 (CET)
bevor die eigentliche eMail beginnt.
Wie muss der Header aussehen, damit meine HTML-eMail richtig ankommt und angezeigt wird?
Oder liegt der Fehler woanders? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo malanox,
als Zeilenumbruch im Header musst Du auf jeden Fall '\r\n' verwenden. Wahrscheinlich musst Du den content-type-Header vor dem From-Abschnitt einfügen.
In der PHP-Doku ist bei den Beispielen (Nummer 4) zu mail() aber auch eines mit HTML:
http://php.net/manual/de/function.mail.php
Damit sollte es eigentlich funktionieren. -
darkpandemic schrieb:
Hallo malanox,
als Zeilenumbruch im Header musst Du auf jeden Fall '\r\n' verwenden. Wahrscheinlich musst Du den content-type-Header vor dem From-Abschnitt einfügen.
In der PHP-Doku ist bei den Beispielen (Nummer 4) zu mail() aber auch eines mit HTML:
http://php.net/manual/de/function.mail.php
Damit sollte es eigentlich funktionieren.
Habs gerade getestet.
Leider habe ich auch feststellen müssen, dass nur der erste Header-eintrag ausgewertet wird.
Das bedeutet, wenn FROM zuerst steht, ist ein Absender eingetragen, aber die Mail kommt als Text an.
Trage ich zuerste Content-type ein, erhalte ich eine html-eMail, aber ohne Absender.
Außerdem funktionieren bei der HTML eMail keine Umlaute (zumindest als ä) im Betreff.
Kann man das auch irgendwie einstellen??
Beitrag zuletzt geändert: 5.1.2012 17:17:34 von malanox -
Hallo malanox,
im Betreff werden die HTML-Codes nicht ausgewertet. Da kannst Du nur reinen Text reinschreiben.
Ich habe mir gerade mal eine Testmail geschickt. Mit dieser Reihenfolge kam auch der Absender richtig an:
$headers = "Content-Type: text/html;\r\n"; $headers .= "To: test@example.com \r\n"; $headers .= "From: darkpandemic@lima-city.de \r\n";
Edit: Wichtig ist natürlich wieder das '\r\n' nach dem content-type.
Beitrag zuletzt geändert: 5.1.2012 17:37:10 von darkpandemic -
Bei mir muss irgendetwas anderes sein...
Mein Aufruf sieht jetzt so aus:
return mail($this->recipients, $this->subject, $this->content, 'Content-Type: text/html; charset=utf-8'."\r\n".'To: '.$this->recipients."\r\n".'From: '.$this->sender."\r\n");
Leider hat sich nichts geändert.
Immernoch kein Absender eingetragen.
Mein Aufruf ist aber korrekt, oder? -
Hallo malanox,
der Aufruf sieht zumindest richtig aus. Hier ist mein vollständiger Test-Code:
Ich habe damit eine E-Mail auf meinen Googlemail Account geschickt. Du kannst ja mal versuchen, ob das bei Dir auch funktioniert. Einfach 'test@example.com' durch Deine E-Mail ersetzen.<?php // Setting a timezone, mail() uses this. date_default_timezone_set('Europe/Berlin'); // recipients $to = "test@example.com"; // subject $subject = "HTML-Mail-Test"; // Add in our content boundary, and mime type specification: $headers = "Content-Type: text/html; charset=utf-8 \r\n"; // additional headers $headers .= "To: test@example.com\r\n"; $headers .= "From: darkpandemic@lima-city.de \r\n"; // Your message here: $body = "<h1>Hallo</h1>"; $body .= "<i>Test</i>"; // Finally, send the email mail($to, $subject, $body, $headers); ?>
Edit: Es funktioniert auch mit
"From: Dark Pandemic <darkpandemic@lima-city.de> \r\n"
Beitrag zuletzt geändert: 5.1.2012 18:08:34 von darkpandemic -
Funktioniert auch nicht.
Die eMail, die ich erhalte sieht wie folgt aus:
To: dechi19@gmx.de From: malanox@lima-city.de Message-Id: Date: Thu, 5 Jan 2012 18:09:17 +0100 (CET) Hallo Test
Es ist also auch diesmal nur der erste Header-eintrag (content-type) ausgewertet worden.
Also wieder kein Absender.
Beitrag zuletzt geändert: 5.1.2012 18:13:26 von malanox -
Hallo malanox,
ich konnte den Fehler gerade reproduzieren. Die Absenderinfo geht genau dann verloren, wenn das erste Argument der mail()-Funktion eine Adresse vom Typ:
beinhaltet. Wird stattdessen einfachTest <test@example.com>
verwendet, dann geht alles gut.test@example.com
D.h. Du solltest mal
anstelle von$mailer->setRecipients('dechi19@gmx.de');
versuchen.$mailer->setRecipients('Dechi <dechi19@gmx.de>');
-
Sorry, aber ich bekomme trotzdem eine "falsche" eMail.
Habe sogar 1:1 deinen code übernommen und nur meine Ziel und Absenderadresse geändert.
// recipients $to = "dechi19@gmx.de"; // subject $subject = "HTML-Mail-Test"; // Add in our content boundary, and mime type specification: $headers = "Content-Type: text/html; charset=utf-8 \r\n"; // additional headers $headers .= "To: dechi19@gmx.de\r\n"; $headers .= "From: malanox@lima-city.de \r\n"; // Your message here: $body = "<h1>Hallo</h1>"; $body .= "<i>Test</i>"; // Finally, send the email mail($to, $subject, $body, $headers);
Kommt trotzdem falsch an.
Habe auch meine Variante nochmal so versucht, wie du es eben geschrieben hattest, aber auch ohne Erfolg. -
Hallo malanox,
ich habe jetzt den von Dir geposteten Code genommen und wieder meine E-Mail-Adresse (To-Abschnitt) eingesetzt.
Das hat wieder funktioniert. Ich habe jetzt das gleiche auch noch mal mit dechi19@gmx.de gemacht.
Du kannst ja mal kontrollieren, was bei Dir angekommen ist. -
malanox schrieb:
To: dechi19@gmx.de From: malanox@lima-city.de Message-Id: Date: Thu, 5 Jan 2012 18:09:17 +0100 (CET) Hallo Test
Es ist also auch diesmal nur der erste Header-eintrag (content-type) ausgewertet worden.
Also wieder kein Absender.
Kommt bei mir genauso an, wie wenn ich es abschicke. (s. Zitat) -
Ich habe mit gerade mal den Quelltext der E-Mail angeschaut:
Dabei ist mir aufgefallen, dass der "To:"-Abschnitt zweimal vorkommt. Vielleicht wird das durch Dein Mail-Programm bzw. Webmail als Fehler interpretiert. Du kannst ja mal schauen, was passiert, wenn man den "To:"-Abschnitt aus dem Header entfernt. Also nur noch:Delivered-To: test@example.com Received: by 10.229.78.193 with SMTP id m1cs506169qck; Thu, 5 Jan 2012 09:27:45 -0800 (PST) Received: by 10.14.126.80 with SMTP id a56mr1077769eei.121.1325784464068; Thu, 05 Jan 2012 09:27:44 -0800 (PST) Return-Path: <darkpandemic@web2.lima-city.de> Received: from web2.lima-city.de ([212.83.45.153]) by mx.google.com with ESMTP id w47si6380072eeb.26.2012.01.05.09.27.43; Thu, 05 Jan 2012 09:27:43 -0800 (PST) Received-SPF: neutral (google.com: 212.83.45.153 is neither permitted nor denied by best guess record for domain of darkpandemic@web2.lima-city.de) client-ip=212.83.45.153; Authentication-Results: mx.google.com; spf=neutral (google.com: 212.83.45.153 is neither permitted nor denied by best guess record for domain of darkpandemic@web2.lima-city.de) smtp.mail=darkpandemic@web2.lima-city.de Received: by web2.lima-city.de (Postfix, from userid 210101) id 80A3B66E17; Thu, 5 Jan 2012 18:27:43 +0100 (CET) To: test@example.com Subject: HTML-Mail-Test Content-Type: text/html; charset=utf-8 To: test@example.com From: Malanox <malanox@lima-city.de> Message-Id: <20120105172743.80A3B66E17@web2.lima-city.de> Date: Thu, 5 Jan 2012 18:27:43 +0100 (CET) <h1>Hallo</h1><i>Test</i>
// Add in our content boundary, and mime type specification: $headers = "Content-Type: text/html; charset=utf-8 \r\n"; // additional headers $headers .= "From: malanox@lima-city.de \r\n";
-
Ändert auch nichts.
Logischerweise fehlt jetzt natürlich der To-Teil im dargestellten Header.
Hoffentlich gehen dir deine Ideen nicht aus.
Danke schonmal -
Hallo malanox,
ich glaube, ich muss Deine Hoffnungen jetzt leider ein wenig enttäuschen.
Zumindest weiß ich jetzt warum das so ist. Also bei GoogleMail und Web.de wird die E-Mail korrekt angezeigt.
Bei GMX werden irgendwelche Zeilen eingefügt:
Diese Zeilen werden von einer Leerzeile gefolgt. Eine solche Leerzeile wird aber genau als Trenner zwischen Header und Body interpretiert. Da diese Leerzeile aber nicht von PHP oder dem Skript sondern von GMX kommt, fällt mir jetzt erstmal nichts mehr ein, wie sich das verhindern ließe. Dazu müsste man ja bei GMX rumprogrammieren.X-GMX-Antivirus: 0 (no virus found) X-GMX-Antispam: 3 (No reverse DNS record); Detail=5D7Q89H36p4L00VTXC6D4q0N+AH0PUCnGL2vqOgpaBYL16oitsMrgDt/NQNpSCZFSflc5 T+wmVvGhi6RhogBToL7ufA112mYAq1G10J2trwt6Mmlp/gIM2/6ant6mrHolC9LN9ZRtilaJMGaN 3QaCA==V1;
Edit:
malanox schrieb:
...
Hoffentlich gehen dir deine Ideen nicht aus.
...
Ich habe etwas gesucht und bin fündig geworden. Wenn man eine E-Mail an GMX sendet, dann darf man nicht '\r\n' als Zeilenumbruch verwenden sondern nur '\n'. Dann sollte es funktionieren.
Der Haken an der Sache ist aber, dass in RFC 2822 als Zeilenumbruch '\r\n' definiert ist und '\n' alleine eigentlich kein gültiges Zeilenende darstellt. Mit '\r' bzw. '\n' alleine hatte ich an anderer Stelle schon einmal Probleme als es um Multipart E-Mails ging. Da war GMX nicht das Testgelände und es hat nur mit '\r\n' funktioniert.
Von daher müsste man eigentlich eine Provider-Weiche bauen:
Wenn Provider == GMX dann '\n' Sonst '\r\n'
Beitrag zuletzt geändert: 5.1.2012 20:16:47 von darkpandemic -
Okay vielen Dank für die Hilfe und Mühe.
Liegt leider wirklich an GMX.
Dann werd ich mir was entsprechendes einfallen lassen
<-- Thread closed --> -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage