Mails sturen met PHP doe je standaard met de mail() functie. Voor standaard mailtjes die uit platte tekst bestaan, gaat dit prima. Het wordt echter wat lastiger als je HTML mails wilt versturen, bijlagen wilt toevoegen of andere headers wilt toevoegen aan de mail-functie. Het kán nog steeds, maar er zijn classes aanwezig die dit soort acties een stuk vergemakkelijken. Eén van deze classes is phpmailer. De class is in staat om op een makkelijke manier de volgende dingen te kunnen doen:
Helaas is de laatste editie (1.73) van phpmailer uit 2005. Aan de andere kant: Als het goed werkt hoeft het niet nieuw te zijn.
phpclassmailer is in staat om mails te versturen via Simple Mail Transfer Protocol. SMTP gebruik je bijvoorbeeld als je veel mails in één keer wilt versturen en je hiervoor meerdere SMTP servers wilt gebruiken. In de regel zul je niet veel gebruik maken van SMTP, maar het is wel zo correct om te noemen dat het mogelijk is.
Omdat phpmailer in principe behoorlijk eenvoudig werkt, lopen we een aantal voorbeelden langs die steeds een uitbreiding op het vorige voorbeeld zijn. Al doende leert men in dit geval het snelst.
Als je phpmailer download, vind je in de root twee classes. Omdat we SMTP even links laten liggen, hebben we class.smtp.php niet nodig. De andere class (class.phpmailer.php) zetten we in een map /include. Hieronder plaatsen we een stuk code voor het versturen van een simpel mailtje naar een paar geadresseerden. De mail wordt in plain-text verstuurd en had dus prima met de mail() functie verstuurd kunnen worden.
<?php
// Include de class
include("include/class.phpmailer.php");
// Maak een instantie van het object aan
$mail = new PHPMailer();
// Geef de afzender aan
$mail->From = "info@domein.nl";
$mail->FromName = "Naam van de afzender";
// Bepaal de geadresseerden
$mail->AddAddress("info@domein1.nl", "Naam van ontvanger 1"); // Eerste geadresseerde
$mail->AddAddress("info@domein2.nl"); // Tweede geadresseerde, de naam is niet verplicht
$mail->AddCC("info@domein3.nl", "Naam van ontvanger 3"); // Eerste CC
$mail->AddBCC("info@domein4.nl", "Naam van ontvanger 4"); // Eerste BCC
// Inhoud van de mail
$mail->Subject = "Onderwerp van de mail";
$mail->Body = "Hallo! \n\n Dit is enkel een testje.";
// Maximaal aantal karakters
$mail->WordWrap = 50;
// Probeer de mail te versturen
if(!$mail->Send()){
echo 'Er ging iets mis tijdens het versturen, namelijk:<br>';
echo $mail->ErrorInfo;
}else{
echo 'De mail is verstuurd.';
}
?>Waarschijnlijk is de code voldoende becommentarieerd. Het enige waar ik iets over wil zeggen is de Word Wrap. Deze variabele is op 50 bepaald en dit betekent dat na 50 karakters een \n wordt toegevoegd aan de mail zodat een regel nooit langer is dan 50 karakters.
Een uitbreiding op bovenstaand voorbeeld is het versturen van een HTML mail. phpmailer heeft een mooie functie, namelijk de alternate body. Dit komt er in het kort op neer dat als een ontvangende mailclient geen HTML kan uitlezen, de alternatieve body wordt uitgelezen (welke uiteraard in tekstformaat is). Deze alternatieve body komt in de variabele $mail->Body te staan. Hieronder breiden we bovenstaand voorbeeld uit, waarbij we alle bekende code niet meer becommentariëren.
<?php
include("include/class.phpmailer.php");
$mail = new PHPMailer();
// Geef aan dat het een HTML mail betreft
$mail->IsHTML(true);
$mail->From = "info@domein.nl";
$mail->FromName = "Naam van de afzender";
$mail->AddAddress("info@domein1.nl", "Naam van ontvanger 1");
$mail->AddAddress("info@domein2.nl");
$mail->AddCC("info@domein3.nl", "Naam van ontvanger 3");
$mail->AddBCC("info@domein4.nl", "Naam van ontvanger 4");
$mail->Subject = "Onderwerp van de mail";
// HTML body
$mail->Body = "<p>Hallo!</p><p>Dit is enkel een testje met <strong>HTML</strong>.</p>";
// Alternatieve body
$mail->AltBody = "Hallo! \n\n Dit is enkel een testje met HTML, maar helaas kan je mail client de HTML niet lezen.";
$mail->WordWrap = 50;
if(!$mail->Send()){
echo 'Er ging iets mis tijdens het versturen, namelijk:<br>';
echo $mail->ErrorInfo;
}else{
echo 'De mail is verstuurd.';
}
?>Bedenk bij HTML mails wel dat een redelijk groot deel van de mail clients HTML niet standaard zal uitlezen. Dit betekent dus dat je niet mag vergeten dat er een alternatieve tekst moet worden toegevoegd, omdat je anders de HTML broncode in je mail client krijgt.
Als je HTML mails kan versturen, is de volgende stap natuurlijk dat je plaatjes in je mail wilt toevoegen. Uiteraard kun je verwijzen naar een internetadres voor een plaatje, maar dat is zeer lelijk omdat dit plaatje vaak geen eeuwig leven heeft en ook alleen maar bereikbaar is als de mail wordt bekeken terwijl de PC online is. Dit kan heel makkelijk. Wat je beter kunt doen zijn in feite twee dingen:
Weer zal een voorbeeld veel duidelijk maken:
<?php
include("include/class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsHTML(true);
$mail->From = "info@domein.nl";
$mail->FromName = "Naam van de afzender";
$mail->AddAddress("info@domein1.nl", "Naam van ontvanger 1");
$mail->AddAddress("info@domein2.nl");
$mail->AddCC("info@domein3.nl", "Naam van ontvanger 3");
$mail->AddBCC("info@domein4.nl", "Naam van ontvanger 4");
$mail->Subject = "Onderwerp van de mail";
// Voeg het plaatje toe als bijlage
$mail->AddEmbeddedImage("plaatje.jpg", "cid-van-plaatje", "nieuwe_naam.jpg");
// HTML body met een plaatje
$mail->Body = "<p>Hallo!</p><p>Dit is enkel een testje met <strong>HTML</strong>.</p><p><img src=\"cid:cid-van-plaatje\" alt=\"Plaatje\" /></p>";
$mail->AltBody = "Hallo! \n\n Dit is enkel een testje met HTML, maar helaas kan je mail client de HTML niet lezen.";
$mail->WordWrap = 50;
if(!$mail->Send()){
echo 'Er ging iets mis tijdens het versturen, namelijk:<br>';
echo $mail->ErrorInfo;
}else{
echo 'De mail is verstuurd.';
}
?>Wat je ziet bij de AddEmbeddedImage() functie is dat er drie argumenten zijn. Er zijn zelfs nog twee additionele argumenten, maar daar doen we nu niks mee. Het eerste argument is het relatieve pad naar het plaatje, het tweede argument het cid en het derde argument een nieuwe naam van het plaatje die de oude naam overschrijft - Dit argument is trouwens ook optioneel. Uiteraard kun je in een tekstmail geen plaatjes plaatsen.
Nu we plaatjes in de HTML kunnen krijgen, zal het ook wel niet zo moeilijk meer zijn om bijlagen aan de mail toe te voegen. Dat klopt.
<?php
include("include/class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsHTML(true);
$mail->From = "info@domein.nl";
$mail->FromName = "Naam van de afzender";
$mail->AddAddress("info@domein1.nl", "Naam van ontvanger 1");
$mail->AddAddress("info@domein2.nl");
$mail->AddCC("info@domein3.nl", "Naam van ontvanger 3");
$mail->AddBCC("info@domein4.nl", "Naam van ontvanger 4");
$mail->Subject = "Onderwerp van de mail";
// Voeg een gewone bijlage toe
$mail->AddAttachment("cijfers/omzet.pdf", "Omzet augustus 2007.pdf");
$mail->AddEmbeddedImage("plaatje.jpg", "cid-van-plaatje", "nieuwe_naam.jpg");
$mail->Body = "<p>Hallo!</p><p>Dit is enkel een testje met <strong>HTML</strong>.</p><p><img src=\"cid:cid-van-plaatje\" alt=\"Plaatje\" /></p>";
$mail->AltBody = "Hallo! \n\n Dit is enkel een testje met HTML, maar helaas kan je mail client de HTML niet lezen.";
$mail->WordWrap = 50;
if(!$mail->Send()){
echo 'Er ging iets mis tijdens het versturen, namelijk:<br>';
echo $mail->ErrorInfo;
}else{
echo 'De mail is verstuurd.';
}
?>De functie AddAttachment() heeft één verplicht argument, namelijk het relatieve pad naar de PDF. Het tweede argument is dus optioneel en beslaat de nieuwe naam van de file. De ontvanger ziet dus alleen deze naam. Er zijn nog twee andere argumenten, maar ook deze laten we voor nu achterwege.
Als je de voorbeelden hierboven hebt doorlopen, zul je zien dat het niet zo moeilijk is om phpmailer te gebruiken. Ik gebruik de class bijna in elk project wat ik bouw, omdat er altijd wel ergens óf een contactformulier óf een mailing systeem nodig is. De code is intuïtief leesbaar en erg eenvoudig en beknopt. Een schitterende class!