Feike EDV Beratung München


HTML MIME Mail - MIME Mail mit PHP versenden (PHP4)

MIMEMailxPHP4_V2

+ setSubject(string)
+ setTextContent(string)
+ setHTMLContent(string)
+ setFromHeader(string)
+ setRecievers(string|array)
+ setCCRecievers(string|array)
+ setBCCRecievers(string|array)
+ sendMail(boolean)
+ setEOL(string)
+ addBinaryFileAsAttachment(...)
+ addBinaryStringAsAttachment(...)
+ setReplyTo(string)
+ getLastErrorString()
+ getLastErrorCode()

Das Zusammenbauen einer MIME Mail in PHP ist immer wieder etwas "anstrengend". Darum habe ich diese Klasse geschrieben und stelle sie gerne als Open Source in der GPL zur Verfügung.

Die Klasse kann folgendes versenden: HTML Email, HTML Email mit eingebundenen Bildern (multipart/mixed), HTML Email mit Anhängen, HTML Email mit Anhängen und eingebundenen Bilder, alle HTML Mails mit alternativen Text Inhalten (multipart/alternative), nur Text Email, Text Email mit Anhängen. Eigenes Encoding.

Das Programm ist mit dem PHP Eclipse-Plugin entwickelt, die Funktionen sind wie in Javadoc üblich dokumentiert. Praktisch ist das, weil dadurch innerhalb Eclipse die Code-Completion und die Hover-Hilfe funktionieren!


Online Bookmark erstellen:



Ein Codebespiel zur Verwendung:
/**
 * Testprogramm für die Mailklasse
 * Testumfang: Einfache Textmail an zwei Empfänger senden
 */

// Mailklasse includieren
require_once("MIMEMailxPHP4_V2.inc");

// Instanz der Klasse erzeugen
$mail = new MIMEMailxPHP4_V2();

// Text Inhalt der Mail setzen
$mail->setTextContent("Hallo Welt, dies ist meine Text EMail.");
// Absender (wg. Spam hab ich meine EMail rausgenommen
$mail->setFromHeader("Beispiel1 <beispiel1@beispiel.de>");
// Empfänger setzen
$mail->setRecievers(Array("beispiel1@beispiel.de", "beispiel2@beispiel.de"));
// Betreff setzen
$mail->setSubject("Testmail von MIMEMailxPHP4 V2");

// Mail senden
$rc = $mail->sendMail();

Attachments können via MIME entweder "angehängt" oder "inline" verwendet werden (Content-Disposition). Ein typische Fall von inline-Verwendung ist die eingebettete Grafik. Nachdem fast alle Mail Reader externe Grafiken in HTML Mails blocken, also Konstruktionen wie

<img src="http://bild.nix/meinBild.jpg"/>
in der Mail nicht mehr funktionieren, ist es praktisch inline images zu verwenden (eingebettete Bilder, Content-Transfer-Encoding Base64).

Bei meiner Klasse lassen sich diese Bilder über den Aufruf

$mail->addBinaryFileAsAttachment("../images/logo_klein.jpg", "image/jpg", "logo_klein.jpg", "logobild");
in die Mail übernehmen. Die Referenzierung im HTML Teil der Mail geht dann über:
<img style="width: 112px; height: 19px;" alt="" src="cid:logobild">
"cid:" ist ein mime-standardbezeichner und bedeutet "Content-ID".

Ich gebe die Klasse als Open Source unter GPL heraus. Selbstverständlich übernehme ich keinerlei Gewähr für Funktionalität etc. und lehne jede Haftung für Schäden durch die Verwendung ab.

ZIP Paket (Version 2.2 vom 13.04.2009, ca. 50kb) zum download

Da ich mir Mühe gegeben habe, die Klasse im Code zu dokumentieren, folgt nun der Source Code ohne Funktionskörper. Bei Fragen sind Mails willkommen.
Nun viel Spaß damit.

Die weitere Dokumentation findet hier statt: http://www.feike.biz/open-source-projects/MIMEMailPHP4/index.html


/**
 * ------------------------------------------------------------------------------
 * MIMEMailxPHP4_V2.inc - source code of the free MIME Mail class for PHP4
 *
 * Creation:     2005-01-25  Rainer Feike / feike.biz
 * Last Update:  2006-12-02  Rainer Feike
 * Version:      2.1.0 - HTML MIME Mail mit PHP
 * 
 * Copyright (c) 2001-2006 Rainer Feike, rainer(at)feike(pkt)biz
 *
 * Das Programm ist freie Software unter GPL.
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * ------------------------------------------------------------------------------
 *
 */
class MIMEMailxPHP4_V2 {
	
	/**
	 * Das Zeilenende setzen. Default ist "\n". Einige MTAs haben hier allerdings Probleme, dann kann "\r\n" helfen.
	 * 
	 * @param  $eol das Zeilenendezeichen, Default ist "\n".
	 * @return 0 im Erfolgsfall, Fehlerfall nicht möglich, Fehlercode wird nicht verändert.
	 *
	 */
	function setEOL($eol)
	
	/**
	 * Im Fehlerfall setzen Funktionen einen Fehlercode. Diese Funktion kann den zuletzt
	 * gesetzten Fehlercode zurück geben.
	 * 
	 * @return 0 oder den zuletzt gesetzten Fehlercode, ein Fehlerfall nicht möglich, Fehlercode wird nicht verändert.
	 *
	 */
	function getLastErrorCode()
	
	/**
	 * Gibt die textuelle Beschreibung des zuletzt aufgetretenen Fehlers zurück.
	 * 
	 * @return die textuelle Beschreibung des zuletzt aufgetretenen Fehlers, ein Fehlerfall nicht möglich, Fehlercode wird nicht verändert.
	 *
	 */
	function getLastErrorString()

	/**
	 * Den plaintext Teil der Mail setzen. Dieser Text wird von Mail Clients angezeigt,
	 * die eine HTML Anzeige nicht beherrschen. Falls kein HTML Text angegeben wird, wird
	 * ebenfalls dieser Text in der Mail zu sehen sein. Kein Default.
	 * Falls Sie HTML Content setzen, und den Text Content leer lassen, dann
	 * wird der HTML Content in Text umgewandelt und als TextContent gesetzt 
	 * (sonst können Text-only Clients die Mail nicht lesen).
	 * 
	 * @param $text der zu setzende Text.
	 * @param $charset das charset des Textes, Default ist "ISO-8859-1".
	 * @param $encoding des Texts, Default ist "8bit".
	 * @return 0 im Erfolgsfall, Fehlerfall nicht möglich, Fehlercode wird nicht verändert.
	 * 
	 */
	function setTextContent($text, $charset = "ISO-8859-1", $encoding = "8bit")
	
	/**
	 * Den HTML Teil der Mail setzen. Dieser Text wird von Mail Clients angezeigt,
	 * die eine HTML Anzeige beherrschen. Kein Default.
	 * Auf ein als Attachment angegebenes Bild (inline-image) kann man sich beziehen über den
	 * Syntax <img src="cid:ContentID">, dabei ist ContentID ein Parameter in der
	 * Funktion addBinaryFileAsAttachment und addBinaryStringAsAttachment.
	 * Falls Sie HTML Content setzen, und den Text Content leer lassen, dann
	 * wird der HTML Content in Text umgewandelt und als TextContent gesetzt 
	 * (sonst können Text-only Clients die Mail nicht lesen).
	 * 
	 * @param $html der zu setzende HTML-Code.
	 * @param $charset das charset des HTML, Default ist "ISO-8859-1".
	 * @param $encoding des HTML, Default ist "8bit".
	 * @return 0 im Erfolgsfall, Fehlerfall nicht möglich, Fehlercode wird nicht verändert.
	 * 
	 */
	function setHTMLContent($html, $charset = "ISO-8859-1", $encoding = "8bit")
		
	/**
	 * Eine Binärdatei als Attachment anhängen. Falls die Datei als Inline-Image genutzt
	 * werden soll, geben Sie ContentID an, sonst lassen Sie CID leer. Unter der
	 * angegebenen ContentID kann das Bild dann über <img src="cid:contentID"> als
	 * Inline-Image in der Mail benutzt werden. Intern wird fopen genutzt, es können
	 * also abhängig von der Laufzeitkonfiguration auch URLS genutzt werden.
	 * 
	 * @param $file die einzulesende Datei in relativer oder absoluter Notation.
	 * @param $type der MIME-Typ der Datei, z.B. "image/jpg", "application/pdf" etc.
	 * @param $name der Name unter dem die Datei als attachment genannt wird.
	 * @param $ContentID die ContentID der Datei falls sie als inline-image genutzt wird. Default ist empty.
	 * @return 0 im Erfolgsfall, sonst eine Fehlerzahl aus der Fehlertabelle
	 *
	 */
	function addBinaryFileAsAttachment($file, $type, $name, $ContentID = "")
	
	/**
	 * Einen Binärstring als Attachment anhängen. Falls die Daten als Inline-Image genutzt
	 * werden sollen, geben Sie ContentID an, sonst lassen Sie CID leer. Unter der
	 * angegebenen ContentID kann das Bild dann über <img src="cid:contentID"> als
	 * Inline-Image in der Mail benutzt werden. 
	 * 
	 * @param $string die anzuhängenden Binärdaten.
	 * @param $type der MIME-Typ der Datei, z.B. "image/jpg", "application/pdf" etc.
	 * @param $name der Name unter dem die Datei als attachment genannt wird.
	 * @param $ContentID die ContentID der Datei falls sie als inline-image genutzt wird. Default ist empty.
	 * @return 0 im Erfolgsfall, Fehlerfall nicht möglich, Fehlercode wird nicht verändert.
	 *
	 */
	function addBinaryStringAsAttachment($string, $type, $name, $ContentID = "")
	
	/**
	 * Das Thema, den Betreff der Mail setzen, Default ist ""
	 * 
	 * @param  $subject das Thema (Subject) der Mail.
	 * @return 0 im Erfolgsfall, Fehlerfall nicht möglich, Fehlercode wird nicht verändert.
	 *
	 */
	function setSubject($subject)
	
	/**
	 * Die Headerkomponente REPLY-TO setzen. Default ist "".
	 * 
	 * @param  $repl sie zu setzende Headerkomponente REPLY-TO.
	 * @return 0 im Erfolgsfall, Fehlerfall nicht möglich, Fehlercode wird nicht verändert.
	 *
	 */
	function setReplyTo($repl)

	/**
	 * Die Empfänger der Mail setzen. Es kann ein einzelner String oder ein Array von Strings mit
	 * mehreren Empfänger übergeben werden.
	 * 
	 * @param $rcvs zu setzende Empfänger als String oder Array von Strings, die maximale Länge der Empfängerliste variiert zwischen MTAs.
	 * @return 0 im Erfolgsfall, Fehlerfall nicht möglich, Fehlercode wird nicht verändert.
	 *
	 */
	function setRecievers($rcvs)
	
	/**
	 * Die CC-Empfänger der Mail setzen. Es kann ein einzelner String oder ein Array von Strings mit
	 * mehreren CC-Empfängern übergeben werden.
	 * 
	 * @param $rcvs zu setzende CC-Empfänger als String oder Array von Strings, die maximale Länge der Empfängerliste variiert zwischen MTAs.
	 * @return 0 im Erfolgsfall, Fehlerfall nicht möglich, Fehlercode wird nicht verändert.
	 *
	 */
	function setCCRecievers($rcvs)
	
	/**
	 * Die BCC-Empfänger (versteckte Empfänger) der Mail setzen. Es kann ein einzelner String oder ein Array von Strings mit
	 * mehreren BCC-Empfängern übergeben werden.
	 * 
	 * @param $rcvs zu setzende BCC-Empfänger als String oder Array von Strings, die maximale Länge der BCC-Empfängerliste variiert zwischen MTAs.
	 * @return 0 im Erfolgsfall, Fehlerfall nicht möglich, Fehlercode wird nicht verändert.
	 *
	 */
	function setBCCRecievers($rcvs)
	
	/**
	 * Den Absender der EMail setzen. Default ist "", Bsp. "Jonny <johnny@example.nix>".
	 * 
	 * @param  $from den zu setzenden Absender.
	 * @return 0 im Erfolgsfall, Fehlerfall nicht möglich, Fehlercode wird nicht verändert.
	 *
	 */
	function setFromHeader($from)
	
	/**
	 * Die Mail über PHP mail commando senden. Falls dump = true gesetzt wird, wird
	 * die mail nicht versandt, sondern der generierte Mailtext als string
	 * zurück gegeben. Wir verwenden hier absichtlich das PHP mail. Falls Sie direkt über
	 * SMTP senden möchten, können Sie diese Klasse nicht verwenden.
	 * 
	 * @param  $dump falls true, wird die Mail nicht versandt, sondern ein String mit der Mail zurück gegeben (Testzwecke).
	 * @return 0 im Erfolgsfall, sonst eine Fehlerzahl aus der Fehlertabelle, bzw. der Mailstring falls dump==true gilt.
	 *
	 */
	function sendMail($dump = false)