kostenloser Webspace werbefrei: lima-city


HTML-Mail mit php mail() verschicken

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    malanox

    Kostenloser Webspace von malanox

    malanox hat kostenlosen Webspace.

    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&auml;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>'."&Auml;".'</td></tr><br>';
    $content .= '<tr><td>Datum und Uhrzeit:</td><td>'."&auml;".'</td></tr><br>';
    $content .= '<tr><td>Ort:</td><td>'."&szlig;".'</td></tr></table><br><br>';
    
    $content .= '<table><tr><td>Veranstaltung:</td><td>'."&amp;".'</td></tr><br>';
    $content .= '<tr><td>Datum und Uhrzeit:</td><td>'."&deg;".'</td></tr><br>';
    $content .= '<tr><td>Ort:</td><td>'."---".'</td></tr></table><br><br>';
    
    $content .= 'Mit freundlichen Gr&uuml;&szlig;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&auml;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?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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.
  4. Autor dieses Themas

    malanox

    Kostenloser Webspace von malanox

    malanox hat kostenlosen Webspace.

    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 &auml;) im Betreff.
    Kann man das auch irgendwie einstellen??

    Beitrag zuletzt geändert: 5.1.2012 17:17:34 von malanox
  5. 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
  6. Autor dieses Themas

    malanox

    Kostenloser Webspace von malanox

    malanox hat kostenlosen Webspace.

    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?
  7. Hallo malanox,

    der Aufruf sieht zumindest richtig aus. Hier ist mein vollständiger Test-Code:
    <?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);
     
     ?>
    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.

    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
  8. Autor dieses Themas

    malanox

    Kostenloser Webspace von malanox

    malanox hat kostenlosen Webspace.

    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
  9. 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:
    Test <test@example.com>
    beinhaltet. Wird stattdessen einfach
    test@example.com
    verwendet, dann geht alles gut.
    D.h. Du solltest mal
    $mailer->setRecipients('dechi19@gmx.de');
    anstelle von
    $mailer->setRecipients('Dechi <dechi19@gmx.de>');
    versuchen.
  10. Autor dieses Themas

    malanox

    Kostenloser Webspace von malanox

    malanox hat kostenlosen Webspace.

    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.
  11. 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.
  12. Autor dieses Themas

    malanox

    Kostenloser Webspace von malanox

    malanox hat kostenlosen Webspace.

    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)
  13. Ich habe mit gerade mal den Quelltext der E-Mail angeschaut:
    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>
    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:
    // 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";

  14. Autor dieses Themas

    malanox

    Kostenloser Webspace von malanox

    malanox hat kostenlosen Webspace.

    Ändert auch nichts.
    Logischerweise fehlt jetzt natürlich der To-Teil im dargestellten Header.

    Hoffentlich gehen dir deine Ideen nicht aus.

    Danke schonmal ;-)
  15. 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:
    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;
    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.:confused:

    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
  16. Autor dieses Themas

    malanox

    Kostenloser Webspace von malanox

    malanox hat kostenlosen Webspace.

    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 -->
  17. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!