Inviare e-mail
Termini che devi imparare
- SMTP
- Header
- MIME encoding
Tecniche che devi affinare
- Funzioni MAIL
- Funzioni URL
Come vengono inviate le email
Se stai sviluppando un sito web e in questo tu invii delle email, allora devi sapere come queste
viaggiano attraverso internet nel mondo. Questo ti servirà ad aiutare meglio i tuoi utenti
quando ci saranno dei problemi.
MTA -- Mail Transport Agent
Quando una mail viene inviata da una organizzazione ad un'altra, questa viene inviata da un server ad
un altro server. Il software che gira sul tuo server email è chiamato
Mail transport Agent acronimo di MTA. Esempi di MTA sono:
- sendmail
- postfix
- qmail
- Micro$oft Exchange
- Lotus Notes
Ogni MTA parla con gli altri utilizzando il protocollo SMTP
SMTP -- Simple Mail Transport Protocol
Il Simple Mail Transport Protocol (SMTP) è lo standard
per trasmettere email attraverso internet.
I server ascoltano normalmente la porta 25 per connessioni in entrata SMTP.
Records MX
Quando un MTA deve mandare un messaggio ad un altro MTA, esso deve convertire gli indirizzi email
contenuti in To: Cc: e Bcc: in indirizzi ip. Tutto ciò che c'è dopo la @ viene chiamato
dominio. Questo è qualcosa come @microbot.it o @oonar.com. Il dominio dell'email non è
il vero nome del server. Segue le stesse regole ma non è il vero nome del server. È un tipo
di un alias DNS.
Per ricevere email per il tuo dominio, devi aggiungere un Record MX al tuo server dns.
MUA -- Mail User Agent
Il
Mail User Agent (MUA) non è nient'altro che
un client email...
Esempio:
- Outlook Express
- Evolution
- KMail
- Thunder Bird
- Mutt
- .......
Uno script php che invia email è un altro tipo di MUA.
Preparare PHP
Prima di inviare una email da uno script in php devi prima assicurarti
che la tua versione di php sia stata correttamente configurata.
Se usi PHP sotto unix
Per mandare un email con uno script php ssotto Unix, devi avere un server MTA compatibile
installato sullo stesso server in cui viene eseguito PHP.
Su sistemi unix, php invia email con un comando (sendmail). sendmail è l'MTA standard
per sistemi UNIX.
Quando PHP è compilato, lo script di configurazione cerca sendmail in
/usr/bin:/usr/sbin:/usr/etc:/etc:/usr/lib:
Se lo script configure non trova il comando sendmail questo verrà disabilitato permanentemente.
E le seguenti funzioni php verranno disabilitate completamente ritornando sempre un errore.
- mail() -- non ci sarà
- ezmlm_hash() -- non ci sarà
- mb_send_mail -- ritornerà sempre false
Solo quando PHP viene correttamente compilato con il supporto di sendmail, e sempre ammesso che
i tuoi script utilizzino le email, PHP potrà correttamente inviare email.
Se usi PHP sotto Windows o Netware
Anche se non documentato nel manuale di PHP, se setti il sendmail_path in php.ini, PHP cercherà
di mandare email tramite un wrapper sendmail come se agisse sotto un sistema UNIX. Questo ti eviterà
notevoli problemi, quindi ricordati di darci un'occhiata.
Inviare emails
Usa la funzione mail() per inviare emails con PHP. Il primo parametro di mail() è
il destinatario della email.
Ipotizzando che stai usando lo script PHP sul server che ospita l'MTA e che ci sia un utente locale chiamato
fred allora tutti questi sono indirizzi email validi:
- fred: MTA penserà che stai cercando di inviare una email all'utente locale fred
- fred@example.com: questa è la forma normale per mandare una email
- fred @ example . com: l'MTA cancellerà eventuali spazi
Mandare una email a più di un destinatario
Aggiundi dei destinatari separandoli con la virgola.
Utilizzare gli header dell'email
Gli header delle email sono linee di testo che vanno all'inizio di un testo email. Queste informazioni
vengono utilizzate dal MTA e dall'MUA. Ogni header deve terminare con la stringa "\r\n".
Gli header Cc: e Bcc:
Gli header cc: e bcc: consentono di inviare una stessa email a più persone. Tutti i destinatari
delle email possono leggere le email in To: e Cc: ma non possono leggere le email presenti in Bcc:
(che significa Blind Carbon Copy)
Gli header cc e bcc sono opzionali. Se li metti devi seguire le stesse regole per To:
Header From:
L'Header from: dice all'MTA chi sta inviando l'email.
Se non provvedi a mettere un header from: php potrebbe o non potrebbe metterne uno.
- Se invii email con sendmail, PHP lascerà l'MTA decidere quale mittente specificare
- Se invii email con Windows allora PHP specificherà automaticamente ciò
che si trova nel file php.ini alla voce sendmail_from.
Impostare il soggetto
Il secondo parametro di mail() è il soggetto dell'email.
Formattare una email
Il terzo parametro della funzione mail() è l'email ovvero il testo.
Email plain text
Email plain text sono semplici stringhe a 7-bit US-ASCII con ogni linea separata da \r\n.
Il codice seguente invierà una email di solo testo:
Nota:
Alcuni MTA sotto unix accettano anche stringhe separate da soli \n ma dovresti aspettarti dei problemi
da questo comportamento. Io lo sconsiglio
<?php
// a chi va l'email?
// cambiala con la tua email
$to = "demenziale@altervista.org";
// quale è il messaggio?
$messagge = "Questa è la mia prima email, mandata con PHP \r\n"
. "E questa è la seconda lineadi testo\r\n";
//vuoi inserire qualcun'altro?
$headers = "Cc: info@oonar.com\r\n";
//mandiamo l'email
$result = mail( $to, "La mia prima email in PHP", $message, $headers);
?>
Di default, tutte le email inviate sono di solo testo. Se vuoi inviare email in html, devi creare
una semplice email MIME-encoded.
email html base
Multipurpose Internet Mail Extensions (MIME) definisce uno standard
di mandare email con allegati, e/o contenuto che non è US-ASCII a 7bit.
Per inviare una email in HTML, tutto ciò che ti serve è
- Aggiungere questo header:
MIME-Versione: 1.0
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
- Passare un messaggio in html al terzo parametro della funzione mail()
Tutte le immagini, url, css ecc. devono essere in url completi. Ricorda che per motivi di sicurezza
molti client email non scaricheranno automaticamente foto o script in javascript.
Allegare file ai messaggi
Per allegare un file ad un messaggio devi creare un messaggio con MIME multipart.
- Passa questo header al quarto parametro della funzione mail():
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="php-12345"
Nota il boundary alla fine dell'header content-type Il boundary è una stringa arbitraria
US-ASCII che spiega all'MUA quando viene raggiunta la fine di un blocco MIME. Ovviamente la stringa
non deve ripetersi nel messaggio dell'email...
-
La prima parte del testo della tua email dovrebbe essere in solo testo con un messaggio del genere:
Se stai leggendo questo messaggio significa che il tuo client non supporta il MIME. Pefavore fai
un upgrade e prenditene uno che lo supporti.
-php-12345
Nota che alla fine del messaggio ho messo il boundary. Questo spiega al MIME che hai raggiunto la
fine del messaggio. Adesso puoi aggiungere più parti al tuo messaggio.
-
La seconda parte del tuo "messaggio" dovrebbe essere il vero e proprio messaggio. Devi aggiungere
gli header Content-Type e Content-Transfer-Encoding al messaggio:
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Ciao, Se stai leggendo questo allora la mia email sta andando bene
-php-12345
-
Dopo arriva l'allegato. Ogni allegato deve essere aggiunto al messaggio stesso. Anche in questo
caso devi impostare il Content-Type e il Content-Transfer-Encoding ma stavolta non sarà 7bit:
Content-Type: image/jpg
Content-Transfer-Encoding: base64
<allegato>
-php-12345
Esempio:
<?php
$to = 'demenziale@altervista.org';
$messaggio = "Questo è il mio messaggio: ciao!\r\n";
$blank_line = "\r\n";
$boundary_text = "php-12345";
$boundary = "-" . $boundary_text . "\r\n";
$ultimo_boundary = "-" . $boundary_text . "-" . "\r\n";
$headers = "MIME-Version: 1.0\r\n"
. "Content-Type: multipart/mixed; boundary=\"$boundary_text\"\r\n";
$messaggio_mime = "Se stai leggendo questo significa che il tuo"
. "client non supporta il MIME\r\n"
. $boundary;
// seconda parte
$messaggio_mime .= "Se stai leggendo questo significa che sta andando tutto bene\r\n"
. $messaggio
. $black_line
. $boundary;
// adesso aggiungiamo l'allegato
$messaggio_mime .= "Content-Type: image/gif name=\"php.gif\"\r\n"
. "Content-Transfer-Encoding: base64\r\n"
. "Content-Disposition: attachment; file=\"php.gif\"\r\n"
. $blank_line
. chunck_split( base64_encode(file_get_contents( "php.gif" )))
. $blank_line
. $ultimo_boundary;
// inviamo l'email
$result = mail( $to, "Email con allegato", $messaggio_mime, $headers);
?>
Puoi aggiungere tutti gli allegati che vuoi in questo modo ma ovviamente, ricorda, che la grandezza
dell'email cresce e che sarà quindi molto difficile scaricarla soprattutto per chi possiede
ancora una dial-up.
L'ultimo boundary dell'email deve terminare con - quindi se il nostro boundary è
-php-12345
allora l'ultimo boundary sarà
-php-12345-
Immagini in allegato a file html
Email con html cercheranno di scaricare dal tuo server le immagini e i fogli di stile.
Per motivi di sicurezza e privac, molti MUA non faranno questi download, rovinando il look della Vs.
email in html.
Puoi allegare le immagini della tua email e far puntare il codice all'immagine allegata:
-
Cambia il primo Content-Type della email in multipart/related. Non dimenticarti di includere
la definizione del boundary
-
Quando aggiungi una immagine come allegato ricordati di includere questo header addizionale:
Content-Location: url
url è l'url che utilizzi nel tag img per includere l'immagine
<?php
$to = 'demenziale@altervista.org';
$messaggio = "Questo è il mio messaggio: <strong>ciao</strong>!\r\n";
$immagine = "http://demenziale.altervista.org/immagine/php.gif";
$blank_line = "\r\n";
$boundary_text = "php-12345";
$boundary = "-" . $boundary_text . "\r\n";
$ultimo_boundary = "-" . $boundary_text . "-" . "\r\n";
$headers = "MIME-Version: 1.0\r\n"
. "Content-Type: multipart/related; boundary=\"$boundary_text\";type=\"text/html\"\r\n";
$messaggio_mime = "Se stai leggendo questo significa che il tuo"
. "client non supporta il MIME\r\n"
. $boundary;
// seconda parte
$messaggio_mime .= "Se stai leggendo questo significa che sta andando tutto bene\r\n"
. $messaggio
. $black_line
. $boundary;
// adesso aggiungiamo l'allegato
$messaggio_mime .= "Content-Type: image/gif name=\"php.gif\"\r\n"
. "Content-Transfer-Encoding: base64\r\n"
. "Content-Location: $immagine\r\n" .
. $blank_line
. chunck_split( base64_encode(file_get_contents( "php.gif" )))
. $blank_line
. $ultimo_boundary;
// inviamo l'email
$result = mail( $to, "Email html con immagine al suo interno (allegata)",
$messaggio_mime, $headers);
?>
Torna su ^
P H P
D E V E L O P M E N T