Sending Email con PHP
di Marcello Ruta
Introduzione
Pre-requisiti: conoscenza di base di PHP. Software utilizzati Dreamweaver CS3 per la scrittura del codice PHP.
Assets: contact.php, process_mail.inc.php, contact2.php
In questo tutorial vedremo come sfruttare PHP per processare i dati inseriti in un form html e spedirli ad un indirizzo email specifico. Per eseguire questo tutorial prepareremo con Dreamweaver tutto il codice necessario per eseguire i controlli sul form e lo script PHP necessario per l'invio dei dati del form. Alla fine trasformeremo il nostro script in uno script generico per poter essere riutilizzato in altre occasioni. Let's go!!!
1 Step
|
|
Conclusa questa fase passiamo al secondo step.
2 Step
Adesso creiamo il nostro form di raccolta dati, andiamo sulla Barra Inserisci ed individuiamo il tab Moduli, quindi clicchiamo sul Modulo ed inseriamo un form nella nostra pagina, inseriamo tre campi di testo ed una textarea, alla fine la nostra pagina avrà il seguente aspetto:
|
|
Dopo aver concluso l'allestimento dell'interfaccia passiamo alla parte del codice PHP, per la scrittura ci avvarremo di Dreamweaver. Selezioniamo il tab PHP, quindi passiamo in modalità codice e posizioniamo il cursore tra gli apici di action quindi facciamo clic sul pulsantino "echo" presente nel tab PHP, alla fine il codice del tag form dovrebbe apparire cosi:
<form id="frm_contact" name="frm_contatc" method="post" action="<?php echo ?>">
Adesso impostiamo all'interno dell'attributo action tra il tag " php echo" una variabile superglobale $_SERVER['PHP_SELF'], al termine di questa operazione il codice del tag form dovrebbe apparire cosi:
<form id="frm_contact" name="frm_contact" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Con l'uso della variabile predefinita $_SERVER['PHP_SELF'] non facciamo altro che processare il contenuto della pagina corrente.
Sempre in modalità codice, adesso, ci posizioniamo al di sopra del Doctype e usiamo la funzione PHP array_key_exists() per verificare se l'array $_POST contiene il nome dell'attributo del pulsante "Invia" del form. Apriamo un blocco di codice PHP <?php ?> dove andiamo scrivere il nostro script. Quindi definiamo una serie di array dove memorizziamo i valori dei campi del form, ecco come dovrebbe apparire adesso il nostro script:
<?php
if(array_key_exists('send', $_POST)){
//processiamo i dati dell'email
$to = 'tuamail@tuoprovider.it'; // in questa variabile memorizzeremo l'indirizzo email
$subjetc = 'Form Contatto'; // oggetto dell'email
//array list dei campi previsti
$fieldArr = array('nome', 'cognome', 'email', 'note');
//impostiamo i campi obbligatori
$requiredArr = array('nome', 'cognome', 'email', 'note');
//creiamo un array vuoto per alcuni campi mancanti
$missingArr = array();
}
?>
nel prossimo step affideremo ad un ciclo foreach il compito di processare i dati memorizzati nell'array, procediamo:
<?php
if(array_key_exists('send', $_POST)){
//processiamo i dati dell'email
$to = 'tuamail@tuoprovider.it'; // in questa variabile memorizzeremo l'indirizzo email
$subjetc = 'Form Contatto'; // oggetto dell'email
//array list dei campi previsti
$fieldArr = array('nome', 'cognome', 'email', 'note');
//impostiamo i campi obbligatori
$requiredArr = array('nome', 'cognome', 'email', 'note');
//creiamo un array vuoto per alcuni campi mancanti
$missingArr = array();
//processiamo ed otteniamo i dati del form
foreach($_POST as $key => $value){
//assegniamo ad un array temp i valori
if(is_array($value)){
$temp = $value;
}else {
$temp = trim($value);
}
if(empty($temp) && in_array($key, $requiredArr)) {
array_push($missingArr, $key);
} elseif (in_array($key, $fieldArr)){
${$key} = $temp;
}
}
}
?>
array_key_exists: Controlla se l'indice (o chiave) specificato esiste nell'array
is_array: Verifica se una variabile è un array
in_array: Controlla se un valore è presente in un array
empty: Determina se una variabile è valorizzata
array_push: Aggiunge uno o più elementi ad un array
trim: Rimuove gli spazi vuoti ad inizio e alla fine di un testo
Adesso costruiremo il corpo del messaggio che sar? inviato al nostro indirizzo email.
<?php
if(array_key_exists('send', $_POST)){
//processiamo i dati dell'email
$to = 'tuamail@tuoprovider.it'; // in questa variabile memorizzeremo l'indirizzo email
$subjetc = 'Form Contatto'; // oggetto dell'email
//array list dei campi previsti
$fieldArr = array('nome', 'cognome', 'email', 'note');
//impostiamo i campi obbligatori
$requiredArr = array('nome', 'cognome', 'email', 'note');
//creiamo un array vuoto per alcuni campi mancanti
$missingArr = array();
//processiamo ed otteniamo i dati del form
foreach($_POST as $key => $value){
//assegniamo ad un array temp i valori
if(is_array($value)){
$temp = $value;
}else {
$temp = trim($value);
}
if(empty($temp) && in_array($key, $requiredArr)) {
array_push($missingArr, $key);
} elseif (in_array($key, $fieldArr)){
${$key} = $temp;
}
}
//costruiamo il messaggio
if(empty($missingArr)){
$message = "Nome: $nome\r\n\r\n";
$message = "Cognome: $cognome\r\n\r\n";
$message .= "Email: $email\r\n\r\n";
$message .= "Note: $note";
$headers = "From: $name<$email>"; // popoliamo il campo from dell'email $nome e $email
if (!empty($email)){
$headers .= "\r\nReply-To: $email";
}
}
?>
Una volta che abbiamo costruito il corpo del messaggio non ci resta che inviare i dati all'account di posta. Ecco come dovrebbe apparire il nostro script:
<?php
if(array_key_exists('send', $_POST)){
//processiamo i dati dell'email
$to = 'tuamail@tuoprovider.it'; // in questa variabile memorizzeremo l'indirizzo email
$subjetc = 'Form Contatto'; // oggetto dell'email
//array list dei campi previsti
$fieldArr = array('nome', 'cognome', 'email', 'note');
//impostiamo i campi obbligatori
$requiredArr = array('nome', 'cognome', 'email', 'note');
//creiamo un array vuoto per alcuni campi mancanti
$missingArr = array();
//processiamo ed otteniamo i dati del form
foreach($_POST as $key => $value){
//assegniamo ad un array temp i valori
if(is_array($value)){
$temp = $value;
}else {
$temp = trim($value);
}
if(empty($temp) && in_array($key, $requiredArr)) {
array_push($missingArr, $key);
} elseif (in_array($key, $fieldArr)){
${$key} = $temp;
}
}
//costruiamo il messaggio
if(empty($missingArr)){
$message = "Nome: $nome\r\n\r\n";
$message = "Cognome: $cognome\r\n\r\n";
$message .= "Email: $email\r\n\r\n";
$message .= "Note: $note";
$headers = "From: $nome<$email>"; // popoliamo il campo from dell'email $nome e $email
if (!empty($email)){
$headers .= "\r\nReply-To: $email";
}
//Inviamo i dati del form all'indirizzo di posta
$mailSent = mail($to, $subject, $message, $headers);
if($mailSent){
unset($missing);
//redirect alla pagina del form
header('Location: contact.php');
exit;
}
}
}
?>
mail: La funzione mail() serve per inviare messaggi di posta elettronica.
A questo punto il nostro script ci permette di inviare dei dati alla nostra casella di posta elettronica, adesso non ci resta che gestire le eccezioni sui campi obbligatori.
3 Step
Posizioniamoci sotto il tag <body> e scriviamo il seguente codice:
<?php
if($_POST && isset($missingArr) && !empty($missingArr)){
?>
<p class="errorMessage">Attenzione, ci sono degli errori nella composizione del messaggio!!!</p>
<?php
}
elseif ($_POST && $mailSent){
?>
<p class="errorMessage">Messaggio inviato correttamente!!!</p>
<?php
}
?>
isset: Verifica se una variabile è definita, mentre unset cancella una variabile.
A questo punto controlliamo se i campi di input del form sono compilati regolarmente o sono lasciati vuoti inoltre preserveremo i campi compilati regolarmente, sui campi non compilati appariranno dei messaggi d'errore e non invierà il form.
<p>
<label for="nome">Nome: <?php if (isset($missingArr) && in_array('nome', $missingArr)) { ?>
<span class="errorMessage">Inserisci il Nome</span><?php } ?></label>
<input type="text" name="nome" id="nome"
<?php if (isset($missingArr)){
echo 'value="'.htmlentities($_POST['nome']).'"';
}
?>
/>
</p>
htmlentities: Converte tutti i caratteri in entità HTML
utilizziamo una struttura condizionale per verificare se la variabile $missingArr esiste, utilizziamo echo per mostrare il valore passato all'attributo value con $_POST['nome'] e con la funzione htmlentities convertiamo i caratteri in entità HTML, a questo punto ripetiamo la stessa operazione per gli altri due campi di testo mentre per il textarea gestiremo il tutto in maniera leggermente diversa.
Ecco il codice che gestisce la textarea:
<p>
<label for="note">Note: <?php if (isset($missingArr) && in_array('note', $missingArr)) { ?>
<span class="errorMessage">Inserisci l'email</span><?php } ?></label>
<textarea name="note" id="note" cols="45" rows="5">
<?php if (isset($missingArr)){
echo htmlentities($_POST['note']);
}
?>
</textarea>
</p>
4 Step
L'ultimo step di questo esercizio consiste nel crearci uno script generico un modo da poterlo riutilizzare in altre occasioni, per fare ciò creeremo process_mail.inc.php (dove cancelleremo tutto il codice html), a questo punto non resta che procedere.
Inseriamo il seguente codice:
if (isset($_SERVER['SCRIPT_NAME']) && strpos($_SERVER['SCRIPT_NAME'], 'inc.php')) exit;
all'inizio dei tag di apertura di script di PHP<?php ?>
fatto ciò andiamo sul file contact.php e lo salviamo di nuovo con il nome contact2.php, a questo punto facciamo un taglia/incolla del seguente dal file contact2.php e lo incolliamo in process_mail.inc.php:
//creiamo un array vuoto per alcuni campi mancanti
$missingArr = array();
//processiamo ed otteniamo i dati del form
foreach($_POST as $key => $value){
//assegniamo ad un array temp i valori
if(is_array($value)){
$temp = $value;
}else {
$temp = trim($value);
}
if(empty($temp) && in_array($key, $requiredArr)) {
array_push($missingArr, $key);
} elseif (in_array($key, $fieldArr)){
${$key} = $temp;
}
}
//costruiamo il messaggio
if(empty($missingArr)){
$message = "Nome: $nome\r\n\r\n"; // utilizziamo i caratteri di escape per andare a capo
$message .= "Cognome: $cognome\r\n\r\n";
$message .= "Email: $email\r\n\r\n";
$message .= "Note: $note";
$headers = "From: $nome<$email>"; // popoliamo il campo from dell'email $nome e $email
if (!empty($email)){
$headers .= "\r\nReply-To: $email";
}
//Inviamo i dati del form all'indirizzo di posta
$mailSent = mail($to, $subject, $message, $headers);
if($mailSent){
unset($missing);
//redirect alla pagina del form
header('Location: contact.php');
exit;
}
Alla fine il file process_mail.inc.php dovrebbe avere questo aspetto:
<?php
if (isset($_SERVER['SCRIPT_NAME']) && strpos($_SERVER['SCRIPT_NAME'], 'inc.php')) exit;
// rimuoviamo i caratteri di escape dal POST array
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value) {
$value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
return $value;
}
$_POST = array_map('stripslashes_deep', $_POST);
}
//creiamo un array vuoto per alcuni campi mancanti
$missingArr = array();
//processiamo ed otteniamo i dati del form
foreach($_POST as $key => $value){
//assegniamo ad un array temp i valori
if(is_array($value)){
$temp = $value;
}else {
$temp = trim($value);
}
if(empty($temp) && in_array($key, $requiredArr)) {
array_push($missingArr, $key);
} elseif (in_array($key, $fieldArr)){
${$key} = $temp;
}
}
//costruiamo il messaggio
if(empty($missingArr)){
$message = "Nome: $nome\r\n\r\n"; // utilizziamo i caratteri di escape per andare a capo
$message .= "Cognome: $cognome\r\n\r\n";
$message .= "Email: $email\r\n\r\n";
$message .= "Note: $note";
$headers = "From: $nome<$email>"; // popoliamo il campo from dell'email $nome e $email
if (!empty($email)){
$headers .= "\r\nReply-To: $email";
}
//Inviamo i dati del form all'indirizzo di posta
$mailSent = mail($to, $subject, $message, $headers);
if($mailSent){
unset($missing);
//redirect alla pagina del form
header('Location: contact.php');
exit;
}
}
?>
A questo punto il tutorial è concluso ed il tutto e pronto all'uso, basta caricare sul proprio server i file contact2.php e process_mail.inc.php e fare dei test mettendo un proprio indirizzo email.
Risorse.
Concludiamo questo tutorial con un pò di risorse.
Download di PHP: http://www.php.net/downloads.php
Informazioni sull'installazione: http://www.php.net/manual/it/install.windows.php
Informazioni sul linguaggio: http://www.php.net/manual/it/langref.php
File Allegato: Sending Email PHP

