In queste settimane ho affrontato il tema del responsive design per la posta elettronica — la scorsa settimana, ad esempio, ho mostrato alcune righe di codice sull’inserimento del markup. Suggerivo d’inviare le e-mail in un doppio formato, HTML e solo-testo: è il momento di spiegare come ciò sia possibile, dal punto di vista tecnico. Illustrerò la funzione mail() di PHP, perché la utilizzo più o meno quotidianamente, ma potreste ottenere lo stesso identico risultato con ASP… o altri linguaggi di programmazione orientati al web.

La documentazione ufficiale di PHP è esaustiva, se siete abbastanza esperti: parto dal presupposto che non lo siate – dubitando del fatto che abbiate bisogno delle mie spiegazioni, in caso contrario – per integrarla con le istruzioni per inviare le e-mail in entrambi i formati. Avevo già spiegato il concetto, ma non la prassi. Tutti quei dettagli apparentemente complicati avranno un significato e scoprirete che non è affatto difficile, come avreste potuto immaginare. È soltanto un problema di markup e meta-informazioni allegate.

La funzione mail() prevede cinque parametri, tre dei quali obbligatori: $to è il campo dove specificare il destinatario, $subject quello per indicare l’oggetto e $message include il corpo del messaggio — perché la nostra e-mail sia inviata in HTML e solo-testo, dobbiamo utilizzare un quarto parametro che istruisca il linguaggio. È $additional_headers, in cui specificheremo tutte le meta-informazioni necessarie. Procederò con ordine, senza dare nulla per scontato, commentando il codice da modificare seguendo le proprie esigenze.


<?php
date_default_timezone_set('Europe/Rome');
function leo_mail() {
$to = 'alias@domain.ext';
$subject = 'leo Hi tech';
$boundary = md5(date('r', time()));

Ho impostato il fuso orario su Europe/Rome perché il $boundary – necessario a inviare il messaggio nei due formati – è, come consuetudine, basato sulla data: il nome leo_mail della funzione che contiene il codice è fittizio, come l’indirizzo del destinatario e l’oggetto della e-mail. In questa fase, l’attenzione dev’essere posta proprio sul boundary che utilizza l’algoritmo md5 per la crittografia. Potreste usare degli algoritmi differenti o una stringa diversa dalla data e ora d’invio del messaggio. Io, però, non lo consiglio.


$message = '--' . $boundary . "\r\n";
$message .= 'Content-type: text/plain; charset=UTF-8' . "\r\n" . 'Content-transfer-encoding: quoted-printable' . "\r\n";
$message .= 'hello, world';
$message .= '--' . $boundary . "\r\n";
$message .= 'Content-type: text/html; charset=UTF-8' . "\r\n" . 'Content-transfer-encoding: quoted-printable' . "\r\n";
$message .= '<!DOCTYPE html>' . "\r\n" . '<html dir="ltr" lang="it-IT">' . ' <head>' . "\r\n" . ' <style>' . "\r\n" . ' body { background-color: #fff; color: #000; }' . "\r\n" . ' div { width: 100%; }' . "\r\n" . ' @media only screen and (max-width: 640px) { div { width: 50%; } }' . "\r\n" . ' </style>' . "\r\n" . '<head>' . "\r\n" . ' <body>. "\r\n" . ' <div>' . "\r\n" . ' <p>hello, world</p>' . "\r\n" . ' </div>' . "\r\n" . ' </body>' . "\r\n" . '</html>' . "\r\n";
$message .= '--' . $boundary . '--';

Come potete vedere, il boundary dev’essere inserito tre volte e cioè prima del messaggio in testo semplice, prima di quello in HTML e chiudendo $message. Le informazioni sul Content-type devono essere incluse tra il boundary e il corpo, anziché nelle intestazioni che indicheremo nel prossimo paragrafo. Se notate, ho dovuto inserire "\r\n" per indicare l’interruzione delle righe: sono carriage return e new line, entrambi obbligatori. Almeno, indicando i meta-dati per Content-type, Content-transfer-encoding e i boundary.


$additional_headers = 'MIME-Version: 1.0' . "\r\n" . 'Content-type: multipart/alternative; boundary=' . $boundary . "\r\n" . 'Content-transfer-encoding: quoted-printable' . "\r\n" . 'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $additional_headers);
}
?>

Tra le $additional_headers, è richiesta l’indicazione del particolare Content-type e del boundary che abbiamo generato all’inizio. Ho volutamente escluso i campi opzionali – come From e Reply-to, che comunque suggerisco d’includere – specificando tutti i dettagli essenziali. La funzione in sé è completa, ma dovreste predisporre un modulo che vedremo la settimana prossima o un cron job per gestire l’invio della posta elettronica. Purtroppo, per vedere la corretta indentazione del codice dovete consultare i sorgenti della pagina.

Photo Credit: Sophie & Cie via Photo Pin (CC)