Tutorials arrow Webseiten Tutorials arrow Emails aus PHP mit PHPMailer versenden
TanMar
Tutorials
 
 
Navigation
Tutorials
Windows Tutorials
Linux Tutorials
Programme Tutorials
Webseiten Tutorials
Anbieterkennzeichnung
Ein Service von TanMar WebentwicklungTanMar Tutorials (aktiv)TanMar Surftipps
Zuletzt aktualisiert
Security News
heise Security News

Emails aus PHP mit PHPMailer versenden

Drucken E-Mail

phpmailerOft ist es notwendig, dass PHP Scripte Emails verschicken sei es für Kontaktformulare, die Benachrichtigung bei bestimmten Ereignissen oder für das Versenden von Zugangsdaten oder ähnlichen Informationen.
PHP bietet mit der Funktion mail() eine entsprechende Möglichkeit. Diese ist jedoch sehr spartanisch und nur für die einfachsten Anwendungsfälle ausreichend.
Mit einem ansehendlichen Funktionsumfang wie die Unterstützung von HTML-Mails mit alternativer Textversion, dem Versand über SMTP-Server mit Authentifizierung oder der Unterstützung für eingebettete Bilder schafft die auf SourceFourge erhältliche Klasse PHPMailer Abhilfe.

Installation von PHPMailer

Die Installation von phpmailer gestaltet sich denkbar einfach. Nach dem Download der aktuellen Version wird dieser auf der Festplatte entpackt. Anschließend werden die beiden PHP-Dateien class.phpmailer.php und class.smtp.php sowie das Verzeichnis languages auf den Webspace geladen – in unserem Fall in ein Verzeichnis namens phpmailer:

Auswahl der Dateien zum Upload

Upload der Dateien mit dem FTP-Programm

Erste Schritte

phpmailer ist jetzt einsatzfähig und kann in eigenen Scripten verwendet werden. Dazu wird die Klasse zuerst mir require() eingebunden und anschließend wird unter dem Namen $mail mit new() eine Instanz der Klasse gebildet, über die später Emails verschickt werden können:

<?
  require('phpmailer/class.phpmailer.php');
  
  $mail = new PHPMailer();
?>

Wenn dieses Script erfolgreich auf dem Server aufgeführt wird, kann die erste Testmail verschickt werden. Dazu muss müssen PHPMailer einige Informationen wie der Name und die Adresse des Absenders, die Adresse des Empfängers, Betreff und Text der Email mitgeteilt werden:

<?
  //Klasse einbinden
  require('phpmailer/class.phpmailer.php');
  
  //Instanz von PHPMailer bilden
  $mail = new PHPMailer();
 
  //Absenderadresse der Email setzen
  $mail->From = "test@tanmar.info";
  
  //Name des Abenders setzen
  $mail->FromName = "TanMar Tutorials";
  
  //Empfängeradresse setzen
  $mail->AddAddress("test@tanmar.de");
  
  //Betreff der Email setzen
  $mail->Subject = "Die erste Mail";
 
  //Text der EMail setzen
  $mail->Body = "Hallo! \n\n Dies ist die erste Email mit PHPMailer!";
  
  //EMail senden und überprüfen ob sie versandt wurde
  if(!$mail->Send())
  {
     //$mail->Send() liefert FALSE zurück: Es ist ein Fehler aufgetreten
     echo "Die Email konnte nicht gesendet werden";
     echo "Fehler: " . $mail->ErrorInfo;
  }
  else
  {
     //$mail->Send() liefert TRUE zurück: Die Email ist unterwegs
     echo "Die Email wurde versandt.";
  }
?>

Passen Sie die Adressen an und testen Sie das Script auf Ihrem Webspace. PHPMailer nutzt mir diesen Einstellungen die mail() Funktion von PHP zum Versand. Die Email wird dabei als reine Textmail versandt.

Emails an mehrere Empfänger senden

Emails gleichzeitig an mehrere Empfänger senden

Die Funktion AddAddress() kann auch mehrfach aufgerufen werden, um eine Email gleichzeitig an mehrere Empfänger zu senden:

 
  //Mehrere Empfänger setzen
  $mail->AddAddress('test1@tanmar.de','Testempfänger');
  $mail->AddAddress('test2@tanmar.de');

Wie das Beispiel zeigt, ist es auch möglich, der Funktion zusätzlich zur Email Adresse den Namen des Empfängers zu übergeben. Bei dieser Art des Versands können die Empfänger die Email Adressen der anderen Empfänger sehen.

Weiterhin ist es möglich, zusätzliche Empfänger als CC oder BCC hinzuzufügen:

 
  //Empfänger einer Kopie setzen
  $mail->AddBCC('test1@tanmar.de',);
  //Empfänger einer Blindkopie setzen
  $mail->AddCC('test2@tanmar.de');

Emails separat an mehrere Empfänger senden

Wenn jeder Empfänger seine "eigene" Email bekommen soll, muss die Liste der Empfänger in PHPMailer nach dem Versand einer Email zurückgesetzt werden, so dass jede Email nur an einen Empfänger geht. Dies ist über die Funktion ClearAddresses() möglich:

 
  //Liste der Empfänger  
  $receivers = array("test1@tanmar.de","test2@tanmar.de");
 
  //Liste der Empfänger durchlaufen
  foreach ($receivers as $receiver)
  {
     //Empfänger setzen
     $mail->AddAddress($receiver);
 
     //EMail senden und überprüfen ob sie versandt wurde
     if(!$mail->Send())
     {
       //$mail->Send() liefert FALSE zurück: Es ist ein Fehler aufgetreten
       echo "Die Email konnte nicht gesendet werden<br>";
       echo "Fehler: " . $mail->ErrorInfo;
     }
     else
     {
       //$mail->Send() liefert TRUE zurück: Die Email ist unterwegs
       echo "Die Email wurde versandt.<br>";
     }
  
     //Empfänger zurücksetzen
     $mail->ClearAddresses();
  }

Diese Konstellation eignet sich beispielsweise ideal für den Versand eines Newsletters. Da der Versand von vielen Emails relativ zeitaufwändig werden kann, empfiehlt es sich eventuell, vorab die Zeitbegrenzung über die PHP-Funktion set_time_limit() zu erhöhen. Dies ist jedoch nur möglich, wenn der Safe Mode in PHP deaktiviert ist.

Versand von HTML Emails

PHPMailer unterstützt auch den Versand von Emails im HTML-Format. Dabei wird zusätzlich zu der Nachricht im HTML-Format eine Alternativnachricht im Textformat mit in die EMail eingefügt. Die Wahl des Formats erfolgt dabei über folgenden Befehl:

 
  $mail->IsHTML(true); //Versand im HTML-Format festlegen

Die beiden Nachrichtenteile werden dabei wie folgt gesetzt:

 
  //Text der EMail setzen
  $email_text = "Hallo! \n\n <b>Dies ist die erste Email mit PHPMailer!</b>";
 
  //Body enthält die HTML-Nachricht
  //Zeilenumbrüche werden in <br> umgewandelt
  $mail->Body    = nl2br($email_text);
 
  //Altbody enthält die alternative Textform
  //mit strip_tags() werden die HTML-Tags entfernt 
  $mail->AltBody = strip_tags($email_text);

Versand von Emails mit Attachments

PHPMailer unterstützt auch den Versand von Emails mit Anhängen. Dabei können sowohl Dateien, die auf dem Server liegen als auch Text aus Variablen als Anhang zu einer Email hinzugefügt werden:

  //Eine Datei vom Server als Attachment anhängen
  $mail->AddAttachment('./datei.zip','anhang.zip');
  
  //Text aus einer Variable als Attachment hinzufügen
  $mail->AddStringAttachment($email_text,'anhang.htm');

Der zweite Parameter gibt dabei jeweils an, unter welchem Namen der Anhang zu der Email hinzugefügt werden soll. Dieser muss nicht unbedingt mit dem Namen auf dem Server übereinstimmen.

Falls über eine Instanz von PHPMailer Emails mit unterschiedlichen Attachments verschickt werden sollen, so können die hinzugefügten Attachments mit folgendem Befehl zurückgesetzt werden:

 
  $mail->ClearAttachments(); //Attachments entfernen 

Versand über einen SMTP-Server

Falls notwendig kann PHPMailer Emails auch über einen beliebigen SMTP-Server verschicken. In unseren Tests funktionierte dies ohne Probleme In Verbindung mit gängigen Email-Servern wie Sendmail, Postfix, QMail und sogar mit Microsoft Exchange.

Um den Versand über einen SMTP-Server zu konfigurieren sind lediglich zwei Befehle notwendig:

 
  $mail->IsSMTP(); //Versand über SMTP festlegen
  $mail->Host = "mail.tanmar.de"; //SMTP-Server setzen

Viele SMTP-Server verlangen zwischenzeitlich eine Authentifizierung. Diese Methode wird auch als "SMTP Auth" bezeichnet. Dabei muss zum Versand von Emails ein Benutzername und in Passwort übergeben werden. Die entsprechenden Befehle hierfür lauten wir folgt:

 
  $mail->SMTPAuth = true;     //Authentifizierung aktivieren
  $mail->Username = "benutzername";  // SMTP Benutzername
  $mail->Password = "geheim"; // SMTP Passwort 

Ansonsten unterscheidet sich die Handhabung von PHPMailer beim Versand über einen SMTP-Server nicht von den vorangegangenen Beispielen.

Zeichensatz festlegen

Wenn mehrsprachige Emails versandt werden sollen bzw. die Sprache der Webseite einen bestimmten Zeichensatz erfordert, kann dieser auch in PHPMailer festgelegt werden:

 
  $mail->CharSet  =  "utf-8"; //UTF-8 Kodierung festlegen 

In der Regel wird sich bei mehrsprachigen Projekten der UTF-8 Zeichensatz anbieten. Der Inhalt des versandten Textes muss natürlich im entsprechenden Zeichensatz kodiert sein.

Trackback(0)
Kommentare (19)add comment

Contrixx said:

  Nettes Tutorial. So etwas suche ich schon lange, werde es gleich mal testen. thx
08.05.2008 | url

Snopy1007 said:

  Bei mir kommt immer folgende Fehlermeldung smilies/angry.gif
Language string failed to load: instantiate

Kann mir vllt ma jemand helfen?
10.03.2008

Patrick H said:

  @Schorschi

du musst bei SMTP-Benutzung auch authentifizieren.

$mail->SMTPAuth = true; //Authentifizierung aktivieren
$mail->Username = "benutzername"; // SMTP Benutzername
$mail->Password = "geheim"; // SMTP Passwort

----
Ich hab dafür meine Probleme, dass keine Attachments ankommen.
$mail->AddAttachment($_FILES['datei']['tmp_name'][0], $_FILES['datei']['name'][0]);

Die Datei wird ordnungsgemäß aus dem Formular übergeben und beim Fehlerhandling:
$_FILES['datei']['error'][0];
wird der Wert 0 ausgegeben.
-> PHPNET : Wert: 0; Es liegt kein Fehler vor, die Datei wurde erfolgreich hochgeladen.

Erbitte Hilfe.
05.02.2008

Schorschi said:

  Hallo,
erstmal klasse Tutorial.. gut erklärt. Leider tritt bei mir immer und immer wieder eine Error-Meldung auf. Vielleicht wisst ihr ja wodran das Problem liegt:
Die Email konnte nicht gesendet werden
Fehler: Language string failed to load: recipients_failedtest@example.org

Ich hab alles so gemacht wie beschrieben, aber irgendwie funktioniert das nicht.

mfg Schorschi freue mich über schnelle Hilfe!
27.01.2008 | url

Savas said:

  Kann mir jmand helfen ich kapier das nicht !!!
icq 413737324 smilies/smiley.gif smilies/smiley.gif smilies/wink.gif smilies/wink.gif smilies/wink.gif smilies/wink.gif smilies/wink.gif smilies/cheesy.gif smilies/cheesy.gif smilies/grin.gif smilies/grin.gif smilies/angry.gif smilies/angry.gif smilies/sad.gif smilies/sad.gif smilies/shocked.gif smilies/shocked.gif smilies/cool.gif smilies/cool.gif smilies/tongue.gif smilies/tongue.gif smilies/kiss.gif smilies/cry.gif smilies/cry.gif smilies/cry.gif smilies/cry.gif smilies/cry.gif smilies/cry.gif smilies/cry.gif smilies/cry.gif smilies/cry.gif smilies/cry.gif smilies/cry.gif smilies/cry.gif smilies/cry.gif smilies/cry.gif smilies/cry.gif smilies/cry.gif
16.01.2008 | url

VooDoo said:

  Erstmal danke für dieses super Tutorial.
Habs tatsächlich endlich geschafft mit nem Exchange zu verschicken smilies/smiley.gif

Nun fehlt mir eigentlich nurnoch die Usernamen Erkennung.
Wenn ich zum Beispiel in Outlook ne Mail nicht an ein Mailkonto, sondern an den dahinterstehenden Usernamen schicke, kommt die Mail korrekt an. Allerdings funktioniert das nicht so ohne weiteres mit dieser Klasse.

Gibts dafür ne Lösung?

Besten Dank
VooDoo
11.12.2007

Dani said:

  Servus,

würde auch gern wissen wie ich das KOMPLETT einbinden kann !
Bin leider kein Profi im PHP Bereich, required hab ich es nun, aber nun steht da nur "Mail wurde gesendet" ... Aber wie bring ich das nun auf mein Email Layout ???

Vielleicht kann jemand helfen.
ICQ: 74005567

Danke !!
06.12.2007

Atilla said:

  Also dieses tutorial ist so gut geschrieben ... echt vielen dank... danke danke
26.11.2007

René Klatt said:

  Hallo,

kann mir jemand sagen wie ich einen Antwort Link in die Mail einbauen kann?

$email_tex .= "Hier zur Seite";

Das geht nicht, in der Mail steht einfach nur noch der Text drin, ist aber kein link mehr..

Vielen Dank
21.11.2007 | url

AntonisV@gmx.de said:

  Hallo leute. Bei mir funzt des alles schoen und gut! Sehr gut erklaert alles ganz easy.

Wie bekomme ich es aber hin das auch die Griechische Sprache anerkannt wird???

Eine griechische Sprachdatei bringt PHPMailer nicht mit. Da diese aber ohnehin nur zur verständlichen Ausgabe von Fehlermeldungen benötigt wird sollte das nicht weiter problematisch sein. Sie meinen vermutlich die korrekte Anzeige der kyrillischen Zeichen in der Email. Hierzu müssen Sie den Zeichensatz für die Emails festlegen und sicherstellen, dass die Texte in der angegebenen Kodierung an PHPMailer übergeben werden. Wir haben das Tutorial um diesen Punkt erweitert (s.o.)
30.10.2007

eMBe said:

  Oh man, der stellt meinen Code nicht dar, sondern wandelt das hier gleich um.
Schade, ich hoffe es ist trotzdem verständlich.

TanMar: PHP Code ist in den Kommentaren nicht erlaubt. Leider war die Frage für uns nicht nachvollziehbar. Wenn Sie uns die Frage mit dem Code über das Kontaktformular zukommen lassen, werfen wir hingegen gerne einen Blick darauf.
29.10.2007

eMBe said:

  Upps, hier wird es richtig angezeigt

Also nochmal der reine Code:




Anfrage-ID:JK-C44D0D50DC-07-I
Vorname:Manfred
Name:Mustermann
Anschrift:Musterstrasse
Wohnort:12345 Musterstadt
Telefonsmilies/sad.gif) eMail:muster@mustermann.de


Also die
Tags sind erst durch phpmailer gesetzt worden.
im $email_text sind dei noch nicht drin.

Das Ergebnis ist, das meine Tabelle in der eMail total verschoben ist.

Ich hoffe es ist verständlich, oder vielleicht hat noch jemand das Problem.
Wäre nett wenn mir jemand helfen könnte.

Thx@all
29.10.2007

eMBe said:

  Hallöchen alle zusammen

Ich habe folgende Frage: Wenn ich eine Tabelle versenden will, dann macht mir ja der phpmailer am ende zeile einen Zeilenumbruch rein und das sieht dann in der eMail nicht wirklich gut aus.




Anfrage-ID:JK-C44D0D50DC-07-I
Vorname:Manfred
Name:Mustermann
Anschrift:Musterstrasse
Wohnort:12345 Musterstadt
Telefonsmilies/sad.gif) eMail:muster@mustermann.de

29.10.2007

Tobias said:

  Setze bei 1und1 den SMTP Server einfach auf : mrvnet.kundenserver.de dann läuft der PHPMailer wieder!

Liebe Grüße

Tobias
27.10.2007 | url

komochti said:

  Hallo...

is ne super anleitung aber ich bekomme ne fehlermeldung, ihr könnt euch bestimmt denken welche...

Warning: main(): open_basedir restriction in effect. File(/usr/share/php/phpmailer/class.phpmailer.php) is not within the allowed path(s): (/srv/www/vhosts/merydata.de/httpdocs:/tmp) in /srv/www/vhosts/merydata.de/httpdocs/test/phpmailer/mail.php on line 4

ich hab bis jetzt folgende schritte durchgegangen aber garkeins hat gefunzt

1. ini_set("include_path", ".:/phpmailer/"); eingefügt..
2. include_path in der php.ini geändert..
3. open_dir in der php.ini geändert...
4. phpmailer verzeichnis in den selben ordner wie mein Script gelegt...

tja, mehr wusste ich nicht was ich machen könnte...

wenn einer ne idee hat bitte ich um hilfe smilies/cry.gif
12.10.2007

Pascal said:

  Weiss jemand ob bzw. wie man mit CSS die E-Mails gestalten kann? Funktioniert bei mier nicht. Ich wollte den ganzen Text $email_text mit einem CSS Befehl gestalten.

Weiss da jemand weiter?
29.09.2007

tz said:

  Vielen Dank für dieses Tutorial. Es gibt das gleiche zwar auf der phpmailer-seite auch in englisch, aber ne deutsche variante schadet ja auch ned smilies/wink.gif

Könntet Ihr bitte das Tutorial noch erweitern, immer wieder sehe ich in Foren, dass Anfänger nicht wissen, wie Sie das Formular mit dem Mailer-Skript verbinden. Der phpmailer und dieses Tutorial befassen sich ja nur mit der Technik, die nach Klick auf "Senden" greift.
12.09.2007

st. said:

  Hat noch jemand Probleme mit smtp und 1und1 ?

Das Script funktioniert, die Mails (als Newsletter) gehen raus, aber es kommen jeweils Fehlermeldungen als Mail zurück !

Mail werden nicht zugestellt : SMTP error from remote mailer

St.

09.09.2007

feisty said:

  super tutorial thx
08.09.2007

Kommentar schreiben
quote
bold
italicize
underline
strike
url
image
quote
quote
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley

security image
Bitte den folgenden Code eintragen


busy
 


PAGERANK SEO
computer
Die beliebteste Webseite
© Copyright 2005 TanMar Web-Entwicklung - Berlin. Alle Rechte Vorbehalten.
Kontakt | Links | Photoshop Tutorials | Entspannung | Partner
Social Bookmarking
Bookmark bei: Mr. Wong Bookmark bei: Oneview Bookmark bei: Linkarena Bookmark bei: Favoriten Bookmark bei: Seekxl Bookmark bei: Power Oldie Bookmark bei: Bookmarks.cc Bookmark bei: Linksilo Bookmark bei: Yigg Bookmark bei: Del.icio.us Bookmark bei: Netscape Bookmark bei: Yahoo Bookmark bei: Google Bookmark bei: Technorati Bookmark bei: Reddit Bookmark bei: StumbleUpon Bookmark bei: Digg Bookmark bei: Folkd