PHP tutorial : mail met HTML versturen

Intro

In deze tutorial wordt uitgelegd hoe je met PHP mail kunt versturen met HTML opmaak. De tutorial maakt gebruik van een aantal bestaande classes die uitermate geschikt zijn om met PHP mail te versturen in HTML opmaak. Deze tutorial gaat niet in op alle standaard php functies die gebruikt worden, maar gaat wel in op een aantal functies en methoden uit de gebruikte classes. Onderstaande scripts zijn procedureel geprogrammeerd waarin objecten een belangrijke rol spelen.

Vooral voor beginners is het lastig om met behulp van PHP mail te versturen die een andere opmaak heeft dan gewone tekst. Ook bijlages versturen blijkt een hele opgave. Gelukkig zijn er mensen die hier speciaal scripts voor hebben geschreven waardoor het versturen van mail een ´piece of cake´ wordt. In deze tutorial maak ik gebruik van 2 bestaande classes.
Dit zijn de classes :

Beide classes kun je downloaden vanaf de officiële website. Ik ga niet te diep in op de classes, maar ik bespreek wel de functies die deze classes bieden ten behoeve van het verzenden van e-mail met HTML opmaak.

Het script

<?php

# Tijdens het ontwikkelen en testen van scripts
# hoort de error_reporting op E_ALL te staan
# zodat we alle fouten en waarschuwingen te zien krijgen.
error_reporting(E_ALL);

# Nederlands instellen
setlocale (LC_ALL'nl_NL');

# classes includen
include_once("./classes/class.TemplatePower.inc.php");
include_once(
"./classes/mail/htmlMimeMail.php");

# Variabelen setten
$sDomain         'domein.nl';
$sMailOnderwerp  'Bevestigingsmail';

?>

Vervolgens gaan we met TemplatePower de HTML voor de mail klaar zetten. De templatebestanden zet ik altijd in een aparte map. In dit geval heb ik de naam templates gebruikt. De templatebestanden geef ik altijd de extensie .htm in plaats van .tpl zoals op de officiële site staat. De reden waarom ik dat doe is simpel, .htm wordt door programma's als Dreamweaver en Frontpage herkent en krijgt dan de gewone highlighting van code in die programma's en voor de templateparser maakt het niets uit.

<?php

# Tijdens het ontwikkelen en testen van scripts
# hoort de error_reporting op E_ALL te staan
# zodat we alle fouten en waarschuwingen te zien krijgen.
error_reporting(E_ALL);

# Nederlands instellen
setlocale (LC_ALL'nl_NL');

# classes includen
include_once("./classes/class.TemplatePower.inc.php");
include_once(
"./classes/mail/htmlMimeMail.php");

# Variabelen setten
$sDomain         'domein.nl';
$sMailOnderwerp  'Bevestigingsmail';

# Het Template-object aanmaken vanuit het template bestand
$oTplMail = new TemplatePower"./templates/mail_bevestig.htm" );
$oTplMail->prepare();

?>

Waarbij we de volgende HTML code hebben in het bestand mail_bevestig.htm :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<style type="text/css">

body {
background-color: #C0C0FF;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
color: #0000C0;
line-height: 125%;
}

</style>
</head>
<body>
<p>Beste {voornaam},</p>

<p>Bedankt voor je inschrijving! Je kunt vanaf nu inloggen op de website door op onderstaande link te klikken.<br />
Veel plezier op de website!</p>

<p><a href="http://www.semeleer.nl/">Inloggen</a></p>

<p>Met vriendelijke groet,</p>

<p>Website team</p>

<p>*** Deze mail is automatisch gegenereerd op {datum} ***</p>
</body>
</html>

In deze HTML staan 2 variabelen die geparst moeten worden door het PHP script. Dit zijn voornaam en datum. Deze variabelen parsen we uit in het script :

<?php

# Tijdens het ontwikkelen en testen van scripts
# hoort de error_reporting op E_ALL te staan
# zodat we alle fouten en waarschuwingen te zien krijgen.
error_reporting(E_ALL);

# Nederlands instellen
setlocale (LC_ALL'nl_NL');

# classes includen
include_once("./classes/class.TemplatePower.inc.php");
include_once(
"./classes/mail/htmlMimeMail.php");

# Variabelen setten
$sDomain         'domein.nl';
$sMailOnderwerp  'Bevestigingsmail';

# Het Template-object aanmaken vanuit het template bestand
$oTplMail = new TemplatePower"./templates/mail_bevestig.htm" );
$oTplMail->prepare();

$oTplMail->assign"voornaam",     "Jopie" );
$oTplMail->assign"datum",        strftime("%A %d %B %Y",strtotime(date("Y-m-d"))) );

?>

Een alternatief voor het parsen van variabelen met TemplatePower is het gebruik van een array :

<?php

# Tijdens het ontwikkelen en testen van scripts
# hoort de error_reporting op E_ALL te staan
# zodat we alle fouten en waarschuwingen te zien krijgen.
error_reporting(E_ALL);

# Nederlands instellen
setlocale (LC_ALL'nl_NL');

# classes includen
include_once("./classes/class.TemplatePower.inc.php");
include_once(
"./classes/mail/htmlMimeMail.php");

# Variabelen setten
$sDomain         'domein.nl';
$sMailOnderwerp  'Bevestigingsmail';

# Het Template-object aanmaken vanuit het template bestand
$oTplMail = new TemplatePower"./templates/mail_bevestig.htm" );
$oTplMail->prepare();

$oTplMail->assign( Array( "voornaam" => "Jopie",
                          
"datum"    => strftime("%A %d %B %Y",strtotime(date("Y-m-d")))
                          ));

?>

Dit geeft hetzelfde resultaat, het enige verschil is dat de ene methode waarschijnlijk een paar miliseconden sneller is, maar ik heb geen parsetijd berekeningen gedaan, dus dat mag je zelf doen ;)
In ieder geval is de HTML van de e-mail nu gevuld met de juiste waarden. We gaan de mail klaarzetten met de benodigde informatie.

<?php

# Tijdens het ontwikkelen en testen van scripts
# hoort de error_reporting op E_ALL te staan
# zodat we alle fouten en waarschuwingen te zien krijgen.
error_reporting(E_ALL);

# Nederlands instellen
setlocale (LC_ALL'nl_NL');

# classes includen
include_once("./classes/class.TemplatePower.inc.php");
include_once(
"./classes/mail/htmlMimeMail.php");

# Variabelen setten
$sDomain         'domein.nl';
$sMailOnderwerp  'Bevestigingsmail';

# Het Template-object aanmaken vanuit het template bestand
$oTplMail = new TemplatePower"./templates/mail_bevestig.htm" );
$oTplMail->prepare();

$oTplMail->assign"voornaam",     "Jopie" );
$oTplMail->assign"datum",        strftime("%A %d %B %Y",strtotime(date("Y-m-d"))) );

# Mailobject aanmaken
$oMail = new htmlMimeMail();

# Aan de class doorgeven dat we HTML gaan gebruiken en deze HTML
# met behulp van de methode getOutputContent() doorgeven
$oMail->setHtml($oTplMail->getOutputContent());

# Returnpath setten
$oMail->setReturnPath('noreply@' $sDomain);

# Het 'van' adres zetten
$oMail->setFrom('"' $sDomain '" <noreply@' $sDomain '>');

# Het onderwerp zetten
$oMail->setSubject($sMailOnderwerp);

# X-mailer klaarzetten
$oMail->setHeader('X-Mailer'$sDomain);

?>

Als we een CC en een BCC willen gebruiken krijgen we deze code :

<?php

# Tijdens het ontwikkelen en testen van scripts
# hoort de error_reporting op E_ALL te staan
# zodat we alle fouten en waarschuwingen te zien krijgen.
error_reporting(E_ALL);

# Nederlands instellen
setlocale (LC_ALL'nl_NL');

# classes includen
include_once("./classes/class.TemplatePower.inc.php");
include_once(
"./classes/mail/htmlMimeMail.php");

# Variabelen setten
$sDomain         'domein.nl';
$sMailOnderwerp  'Bevestigingsmail';

# Het Template-object aanmaken vanuit het template bestand
$oTplMail = new TemplatePower"./templates/mail_bevestig.htm" );
$oTplMail->prepare();

$oTplMail->assign"voornaam",     "Jopie" );
$oTplMail->assign"datum",        strftime("%A %d %B %Y",strtotime(date("Y-m-d"))) );

# Mailobject aanmaken
$oMail = new htmlMimeMail();

# Aan de class doorgeven dat we HTML gaan gebruiken en deze HTML
# met behulp van de methode getOutputContent() doorgeven
$oMail->setHtml($oTplMail->getOutputContent());

# Returnpath setten
$oMail->setReturnPath('noreply@' $sDomain);

# Het 'van' adres zetten
$oMail->setFrom('"' $sDomain '" <noreply@' $sDomain '>');

# Het onderwerp zetten
$oMail->setSubject($sMailOnderwerp);

# X-mailer klaarzetten
$oMail->setHeader('X-Mailer'$sDomain);

# Een CC versturen naar het archief
# Hier kun je meerdere adressen zetten, maar die moeten in 1 string staan
$oMail->setCc('Archief <archief@' $sDomain '>, archief_site@gmail.com');

# Een Bcc versturen naar de beheerder
$oMail->setBcc('admin@'$sDomain .', admin_site@gmail.com');

?>

Vervolgens gaan we de mail echt versturen :

<?php

# Tijdens het ontwikkelen en testen van scripts
# hoort de error_reporting op E_ALL te staan
# zodat we alle fouten en waarschuwingen te zien krijgen.
error_reporting(E_ALL);

# Nederlands instellen
setlocale (LC_ALL'nl_NL');

# classes includen
include_once("./classes/class.TemplatePower.inc.php");
include_once(
"./classes/mail/htmlMimeMail.php");

# Variabelen setten
$sDomain         'domein.nl';
$sMailOnderwerp  'Bevestigingsmail';

# Het Template-object aanmaken vanuit het template bestand
$oTplMail = new TemplatePower"./templates/mail_bevestig.htm" );
$oTplMail->prepare();

$oTplMail->assign"voornaam",     "Jopie" );
$oTplMail->assign"datum",        strftime("%A %d %B %Y",strtotime(date("Y-m-d"))) );

# Mailobject aanmaken
$oMail = new htmlMimeMail();

# Aan de class doorgeven dat we HTML gaan gebruiken en deze HTML
# met behulp van de methode getOutputContent() doorgeven
$oMail->setHtml($oTplMail->getOutputContent());

# Returnpath setten
$oMail->setReturnPath('noreply@' $sDomain);

# Het 'van' adres zetten
$oMail->setFrom('"' $sDomain '" <noreply@' $sDomain '>');

# Het onderwerp zetten
$oMail->setSubject($sMailOnderwerp);

# X-mailer klaarzetten
$oMail->setHeader('X-Mailer'$sDomain);

# Een CC versturen naar het archief
# Hier kun je meerdere adressen zetten, maar die moeten in 1 string staan
$oMail->setCc('Archief <archief@' $sDomain '>, archief_site@gmail.com');

# Een Bcc versturen naar de beheerder
$oMail->setBcc('admin@'$sDomain .', admin_site@gmail.com');

# De mail versturen naar de opgegeven adressen in een array
$rMailResult $oMail->send(array('jopie@hotmail.com','jopie@gmail.com'), 'smtp');

# Fout afhandeling
if (!$rMailResult)
{
    
$sFout 'De mail is niet verstuurd door de fouten : ' $oMail->errors;
}

?>

Dit is natuurlijk een eenvoudig voorbeeld met een aantal variabelen die normaal gesproken voortkomen uit bijvoorbeeld een contactformulier, maar het gaat even om de werking van de classes. Met de htmlMimeMail class is het ook mogelijk om bijlages te versturen. Daarvoor moet de bijlage wel al op de server staan. Stel dat je via een formulier bijlages wilt versturen, dan zul je eerst dat bestand moeten uploaden naar de server en dan pas bij de mail voegen. Als het goed is zitten er diverse voorbeelden bij de htmlMimeMail class waarin het versturen van mail met bijlage wordt uitgelegd. In de toekomst zal ik deze tutorial nog verder uitwerken.

Het uiteindelijke script, zonder commentaar en zonder error_reporting komt er zo uit te zien :

<?php

error_reporting
(0);
setlocale (LC_ALL'nl_NL');

include_once(
"./classes/class.TemplatePower.inc.php");
include_once(
"./classes/mail/htmlMimeMail.php");

$sDomain         'domein.nl';
$sMailOnderwerp  'Bevestigingsmail';

$oTplMail = new TemplatePower"./templates/mail_bevestig.htm" );
$oTplMail->prepare();
$oTplMail->assign"voornaam",     "Jopie" );
$oTplMail->assign"datum",        strftime("%A %d %B %Y",strtotime(date("Y-m-d"))) );

$oMail = new htmlMimeMail();
$oMail->setHtml($oTplMail->getOutputContent());
$oMail->setReturnPath('noreply@' $sDomain);
$oMail->setFrom('"' $sDomain '" <noreply@' $sDomain '>');
$oMail->setSubject($sMailOnderwerp);
$oMail->setHeader('X-Mailer'$sDomain);
$oMail->setCc('Archief <archief@' $sDomain '>, archief_site@gmail.com');
$oMail->setBcc('admin@'$sDomain .', admin_site@gmail.com');
$rMailResult $oMail->send(array('jopie@hotmail.com','jopie@gmail.com'), 'smtp');

if (!
$rMailResult)
{
    
$sFout 'De mail is niet verstuurd door de fouten : ' $oMail->errors;
}

unset(
$oTplMail$oMail);

?>

-----------

Tot zo ver ´mail met html versturen´.
Ik hoop dat jullie er wat van geleerd hebben. Mocht je fouten tegenkomen (nobody's perfect) laat me dit dan s.v.p. weten op donny at semeleer dot nl . Uiteraard zijn op- en aanmerkingen ook van harte welkom!

-----------

Overige PHP tutorials:

Mijn elftal zoekt een nieuwe keeper. Weet jij iemand?

-----------

Deze tutorial is gemaakt door Donny Semeleer (Donny_nl). Niets van deze tutorial mag gebruikt worden zonder schriftelijke toestemming van de maker. De gebruikte gegevens zijn fictieve gegevens. Copyright 2006-2010 D. Semeleer. Laatst geupdate op 17 december 2006.