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:
In juni 2007 is een ernstige bug in PHPMailer naar boven gekomen. Thor Larholm heeft de bug 12 juni ontdekt, een dag (en twee jaar) na de kritieke bug fix release 1.73 van PHPMailer. Helaas heeft PHPMailer lang op zich laten wachten met een update.
Inmiddels is versie phpMailer_v2.2.1 uit (juni 2008). Hieronder staat een link naar een hack om de bug te verhelpen, maar het verdient uiteraard de voorkeur te updaten naar de recentste versie.
De bug heeft betrekking op de invoer van een afzender adres. De invoer wordt niet goed gecontroleerd en te snel in een command line functie gestopt. Hierdoor is het mogelijk andere commando’s uit te voeren dan bedoeld zijn.
Larholm heeft zelf een oplossing op zijn weblog geplaatst waarmee het probleem verholpen wordt.
SMTP:
Kan mails versturen naar meerdere TO’s, CC’s, BCC’s en Reply-To’s.
Alternatieve platte tekst mails voor mail clients die geen HTML kunnen lezen.
Goed bruikbare mogelijkheden om plaatjes toe te voegen aan de HTML mail.
Bijlagen kunnnen makkelijk toegevoegd worden.
De class werkt zowel onder Linux als onder Windows.
Voorbeeld 1: Plain tekst:
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.
Voorbeeld 1:
// 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:
‘;
echo $mail->ErrorInfo;
}else{
echo ‘De mail is verstuurd.’;
}
?>
Voorbeeld 2: HTML mail
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.
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 = “
Hallo!
Dit is enkel een testje met HTML.
“;
// 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:
‘;
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.
Voorbeeld 3: Andere bijlagen
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.
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 = “
Hallo!
Dit is enkel een testje met HTML.
“;
$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:
‘;
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.