Menu

Developers

Verschil in PHP mail() headers op windows en unix

7 juni 2011

De mail() functie in PHP is een krachtig maar ook lastig middel bij het versturen van mail. Daar komt nog eens bij dat de implementatie ervan op windows-omgevingen radicaal anders is dan op unix-omgevingen. Op windows wordt direct gebruik gemaakt van SMTP terwijl op unix het verzenden wordt overgelaten aan de systeem-functie sendmail.

Aangezien beide implemenaties nogal 'rauw' zijn dien je bij het gebruik van de mail() functie rekening te houden met de restricties van het SMTP-protocol. Zo dient het hele SMTP-bericht compatible met US-ASCII te zijn. Het verdient dus aanbeveling om bij het opstellen van een mail gebruik te maken van een tool die alle MIME-zaken eenvoudig kan regelen. Zo is er Mail_Mime van PEAR en Zend_Mime van Zend Framework. Maar deze tools helpen alleen bij het opstellen van de mail, niet bij het verzenden ervan. Voor het verzenden van mail zul je vaak nog de mail() gebruiken.

Het belangrijkste verschil in implementatie op windows en unix zit hem in de parameter $additional_headers. Hoewel het handig geweest zou zijn als dit een array was, heeft men bij het maken van de functie gekozen voor een string. Dus moet je zelf de headers aan elkaar plakken. Op windows doe je dat op dezelfde manier als in de SMTP-specs, dus met "\r\n" (Carriage Return + Line Feed). Op unix met alleen een newline, "\n".

Het geval wil dat hiervoor een PHP-contstante bestaat, namelijk PHP_EOL. Die bevat op windows-omgevingen "\r\n" en op unix "\n". Je kunt hiermee dus eenvoudig cross-platform code maken:

$headers = array();
$headers[] = 'From: <email@afzender.nl>';
$headers[] = 'Bcc: <collega@domein.nl>';

mail('ontvanger@adres.nl', 'Subject van de mail', 'Bericht', implode(PHP_EOL, $headers));

Door de headers in een array te zetten kun je ze eenvoudig aan elkaar 'plakken' met de functie implode($glue, $pieces). De constante PHP_EOL bevat de platform-specifieke newline-notatie.

blog comments powered by Disqus

Nieuwsbrief ontvangen?

Velden met een * zijn verplicht

Like ons op Facebook

Klik hieronder om ons te liken op Facebook.