Programmazione
Asp
Asp.NET
Java
Javascript
Php
Oracle

Svaghi
Ascolta Radio
Faccine
Libri
Links

Varie
Cerca nel sito...
Segnalazioni
Scrivimi


Inviare una mail (scarica l'allegato)

Prima di addentrarci nell'esame della funzione, è necessario fare un passo indietro, perchè possiamo utilizzare efficacemente mail(), dobbiamo infatti accertarci che PHP sia correttamente configurato. A questo scopo dobbiamo ovviamente dare un'occhiata al file di configurazione, php.ini, nella parte dedicata a questo argomento:

[mail function]
; For Win32 only.
SMTP = localhost

; For Win32 only.
sendmail_from = me@localhost.com

; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
;sendmail_path =

Come si vede è necessario indicare un server SMTP (Simple Mail Transfer Protocol) ed un indirizzo email che costituirà il mittente di posta predefinito, soltanto nel caso in cui PHP venga eseguito su Windows; nel caso in cui si lavori su piattaforma UNIX, invece, sarà necessario solo verificare il corretto percorso del programma per l'invio di posta che sarà nel 90% dei casi, sendmail che è installato di default su quasi tutti i sistemi UNIX e che si preoccuperà di svolgere tutto il lavoro di invio del messaggio al mail server del destinatario.
Evidente quindi che la funzione mail() si limita semplicemente ad inviare al sistema di posta (locale o remoto), il messaggio elettronico e restituisce TRUE quando il messaggio stesso è passato correttamente, a prescindere dal fatto che la mail sia stata inviata o ricevuta con successo.

(N.B. : nel caso di utenti Altervista il fil php.ini è già stato correttamente settato, quindi non occorre nessun intervento)

LA FUNZIONE MAIL()
Adesso possiamo addentrarci nel dettaglio della funzione mail().
Tale funzione prevede tre argomenti obbligatori, essi sono:
1) l'indirizzo Email (o gli indirizzi, separati fra loro con una virgola) del destinatario
2) il soggetto della Mail
3) il corpo (il contenuto) della mail

prevede, inoltre, altri due parametri facoltativi:
1) il primo destinato a contenere le intestazioni supplementari della mail, fra cui ricordiamo:
From - serve a specificare il mittente della mail stessa, in caso di mancata indicazione, verrà indicato il mittente di default del sistema. La sintassi di From è la seguente:
From: mittente@sito.it o, in alternativa From: mittente
Reply-to: l'indirizzo (o gli indirizzi) di posta elettronica cui inviare le risposte
Cc: Carbon Copy (Copia Carbone), ossia un elenco di ulteriori indirizzi (separati da una virgola), destinatari della mail
Bcc: Blind Carbon Copy (Copia Carbone Nascosta), l'indirizzo ( o gli indirizzi) cui inviare la mail senza che lo stesso (o gli stessi) siano visualizzati tra i destinatari
La versione MIME (Multipurpose Internet Mail Extensions)
Il tipo di contenuto (text/html, text/plain, multipart/mixed)
La codifica di trasferimento dei contenuti
Il set di caratteri

2) nel quinto parametro (facoltativo, aggiunto a partire da PHP 4.05), infine, è possibile specificare dei parametri addizionali a linea di comando.
Tutte le intestazioni vanno separate tra di loro da un carattere di ritorno (\r) più uno di nuova riga (\n), anche se a questo proposito va detto che il carattere \n sarebbe sufficiente (sicuramente lo è sui sistemi UNIX), ma purtroppo si è ben lontani dall'affermarsi di uno standard universale che venga correttamente interpretato da tutti i client di posta e da tutti gli MTA (Mail Transfer Agent), per cui occorre regolarsi di volta in volta.

Alla luce di quanto detto, una mail "completa" potrebbe essere questa:
$headers = "From: mittente\nCc: copy@sito.it\nReply-to: reply@sito.it";
mail("mail@sito.it", "Soggetto", "Contenuto", $headers);

Nel caso in cui si volesse inviare la mail in formato HTML è sufficiente aggiungere una intestazione (appena sotto $headers = ...), per specificare il tipo di contenuto ed il set di caratteri:
$headers .= "Content-Type: text/html; charset=iso-8859-1\n";


(N.B. : nell'allegato è presente il file "invia_mail_semplice.php", qui potete vedere un sempilce form per l'invio di una mail testuale)

MAIL CON ALLEGATO
Di seguito il codice php per poter inviare un file come allegato alla mail. (nell'allegato trovate il file "invia_mail_allegato.php" con il codice completo).
Nel codice sottostante a differenza delle mail che contengono puro testo, entrano in gioco gli standard MIME (Multipurpose Internet Mail Extensions), che consentono di estendere le potenzialità delle mail consentendo, fra l'altro, di allegarvi dei file. Ecco quindi che la prima intestazione che abbiamo specificato è la versione MIME.
Sempre riguardo alle intestazioni, notiamo come il content-type sia multipart/mixed, questo perchè la mail è destinata a contenere dei dati non testuali.
Caratteristica dei messaggi di questo tipo è che il loro corpo deve essere diviso in uno o più parti, separate fra di loro da un delimitatore (boundary) specificato sempre nella stessa intestazione, che non deve assolutamente comparire all'interno delle parti che delimita. Ecco perchè abbiamo usato le funzioni md5(uniqid(microtime())) per costruirlo: esse generano una stringa alfanumerica casuale di 32 caratteri; in questo modo avremo così la certezza pressochè assoluta che la stringa risultante non sarà presente nel corpo della mail.
Ciascuna parte deve pertanto iniziare con il boundary preceduto da due trattini (--$boundary); l'ultima parte del messaggio deve invece essere seguita dal boundary preceduto e seguito da due trattini (--$boundary--), in questo modo si indica al programma di posta che il messaggio non contiene altre parti.
La successiva intestazione, specifica il nome del file allegato (contenuto nella variabile $file_name). A questo punto iniziamo a costruire il corpo della mail suddiviso, come si diceva, in varie parti che iniziano con --$boundary; la prima parte è destinata a contenere il contenuto della textarea (puro testo), per cui vengono specificati il content-type ed il set di caratteri (rispettivamente text/plain e us-ascii), quindi il Content-transfer-encoding, ossia il tipo di codifica utilizzato sui dati e che verrà utilizzato dal sistema di posta che riceverà la mail per la relativa decodifica (7bit è la normale codifica utilizzata sui caratteri US ASCII); segue quindi il contenuto (testuale) vero e proprio del messaggio.
E' la volta quindi dell'allegato. Dopo il boundary vengono indicati il tipo ed il nome del file, quindi il Content-transfer-encoding, base64 in questo caso, che è il tipo di codifica più affidabile per i dati non testuali. Segue infine l'allegato vero e proprio; a questo proposito è necessario fare un passo indietro, dopo che il file viene "letto" (con fread(), che salvaguarda la corrispondenza binaria), viene "trasformato" con la codifica base64 (funzione base64_encode()) e, al contempo, viene suddiviso (con la funzione chunk_split()) in chunks (pezzi) di 76 caratteri, questo perchè i dati codificati con base64 devono essere rappresentati in righe non superiori a 76 caratteri.
A conclusione del corpo della mail ($mail_body) viene quindi inserito il boundary di chiusura (--$boundary--) e la mail può quindi essere inviata.

// ASSEGNIAMO A VARIABILI PIU' LEGGIBILI, LE PROPRIETA' DELL'ALLEGATO
$attach = $_FILES["allegato"]["tmp_name"];
$file_name = $_FILES["allegato"]["name"];
$file_type = $_FILES["allegato"]["type"];
$file_size = $_FILES["allegato"]["size"];

// DELIMITATORE
$boundary = md5(uniqid(microtime()));

// APRIAMO L'ALLEGATO PER LEGGERLO E CODIFICARLO
$file = @fopen($attach, "r");
$contents = @fread($file, $file_size);
$encoded_attach = chunk_split(base64_encode($contents));
@fclose($file);

// INTESTAZIONI DELLA MAIL
$mail_headers .= "From: miamail@altervista.org\r\n";
$mail_headers .= "MIME-version: 1.0\r\n";
$mail_headers .= "Content-type: multipart/mixed; boundary=\"$boundary\"";
$mail_headers .= "X-attachments: $file_name\r\n";

// COSTRUIAMO IL CORPO DELLA MAIL
$mail_body = "--$boundary\n";
$mail_body .= "Content-Type: text/plain; charset=us-ascii\n";
$mail_body .= "Content-Transfer-Encoding: 7bit\n\n";
$mail_body .= "$Contenuto\n\n";
$mail_body .= "--$boundary\n";
$mail_body .= "Content-type: $file_type; name=\"$file_name\"\n";
$mail_body .= "Content-Transfer-Encoding: base64\n";
$mail_body .= "$encoded_attach\n";
$mail_body .= "--$boundary--\n";

if(mail($_REQUEST["mail"], "mail di prova con allegato", $mail_body, $mail_headers)){
        $invioMail = 2;
}