Inviare e-mail
Termini che devi imparare
Tecniche che devi affinare
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: 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: 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. 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:
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.
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