14 commenti tutorial, php

L'invio di email con php è relativamente semplice. Esiste a tale scopo un'unica funzione mail() della quale ho già parlato in un precedente articolo.

 

Essa è semplice da usare se si tratta di semplici email di testo ma nei casi in cui le nostre esigenze sono più complesse conviene ricorrere a librerie che consentono di semplificarci notevolmente il lavoro. A questo scopo ve ne sono diverse ma quella che personalmente preferisco, e che utilizzerò nel presente tutorial, è Switmailer.

Si tratta di una libreria particolamente potente e ricca di funzionalità fra le quali la possibilità di allegare un file alle email che andremo ad inviare attraverso il nostro sito web.

 

Nel seguente tutorial vedremo l'utilizzo di Swiftmailer per la realizzazione di un form contatti. Ma le linee guida illustrate hanno, ovviamente, valenza generale.

DOWNLOAD

 

Il contact form

Un banale contact form che non richiede nessun particolare commeto. Giova solo evidenziale l'enctype utilizzato (enctype="multipart/form-data").

 

La validazione del form è stata eseguita con il plugin Jquery validation di cui ho già parlato in un precedente articolo e a cui rimando per i dattagli. 

Lo style è minimalista dato che esula dagli scopi del seguente tutorial e lascio a voi tutte le personalizzzazioni.

 

Le poche righe di codice php ci serviranno per ottenere il messaggio di successo o insuccesso dal nostro script.

<html>
<head>
<title>Contact form with attachment</title>

<style>
input, label, textarea{ display: block; font-size: 15px; }
label{ margin-top: 20px; margin-bottom: 0px;}
input, textarea{ margin: 0px;  padding: 0px;}
label.error{color: red; margin: 0px; font-size: 12px;}
p.msg_script{ font-size: 20px; color: blue; }
</style>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>   
<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jquery.validate/1.7/jquery.validate.js"></script>
<script type="text/javascript">
$(document).ready(function()  
{ 
          
    $("#contact_form").validate(  
    {  
        rules:  
        {  
        'nome':{  
            required: true 
            },  
		'oggetto':{  
            required: true 
            },
        'email':{  
            required: true,  
            email: true  
            },  
        'messaggio':{  
            required: true,  
            minlength: 5  
            } 
        },  
        messages:  
        {  
        'nome':{  
            required: "Il campo username è obbligatorio!"  
            },  
		'oggetto':{  
            required: "Il campo username è obbligatorio!"  
            },
        'email':{  
            required: "Il campo email è obbligatorio!",  
            email: "Inserisci un valido indirizzo email!"  
            },  
        'messaggio':{  
            required: "Il campo messaggio è obbligatorio!",  
            minlength: "Il tuo messaggio è eccessivamente breve!"  
            }
        }  
    });   
}); 
</script>

</head>
<body>

<?php
$msg = isset($_GET['msg']) ? '<p class="msg_script">' . urldecode($_GET['msg']) . '</p>' : '';
echo $msg;
?>

<form action="send.php" method="post"  enctype="multipart/form-data" id="contact_form">
	<fieldset>
		<label for="nome">Nome*</label>
		<input type="text" id="nome" name="nome" />
		
		
		<label for="oggetto">Oggetto*</label>
		<input type="text" id="oggetto" name="oggetto" />
		
		<label for="email">Email*</label>
		<input type="text" id="email" name="email" />
		
		<label for="messaggio">Messaggio*</label>
		<textarea rows="10" cols="60" id="messaggio" name="messaggio"></textarea>
		
		<label for="allegato">Allega un file (doc, xls, pdf, jpg, jpeg, png, gif, zip, rar)</label>
		<input type="file" name="allegato" id="allegato" />
		
		<br />
		
		<input type="submit" name="invia" value="invia" />
	</fieldset>
</form>
</body>
</html>

 

File di configurazione

Nel file di configurazione (config.php) andremo ad impostare alcuni valori. In particolare il server SMTP, la porta che utilizzeremo e le credenziali di accesso alla nostra email. 

<?php
/************************/
/* SETTING DELLO SCRIPT */
/************************/
define('HOST_SMTP', 'out.alice.it');
define('PORT_SMTP', 25); // FALSE, 25, 465, 587
define('SECUTITY_SMTP', FALSE); // FALSE, ssl, tsl
define('EMAIL_SMTP', 'vostraemail@alice.it');
define('PASSWORD_SMTP', '********');
define('EMAIL_DESTINATARIO', 'destinatario@email.it');
define('MAX_DIM_FILE', 1048576); // 1mb = 1048576 byte
?>

 

I dati SMTP e la porta ci sono forniti, ovviamente, dal nostro provider di posta elettronica. La costante SECURITY_SMTP ci servirà per impostare il protocollo di trasmissione dei dati (se si utilizza la porta 25 impostate come valore FALSE).

 

A titolo puramente esemplificativo, in base hai test che ho condotto, riporto qualcuno dei più diffusi nella seguente tabella.

Email SMPT Port
vostraemail@gmail.com smtp.gmail.com 465 (ssl)
vostraemail@yahoo.com
vostraemail@yahoo.it
smtp.mail.yahoo.com
smtp.mail.yahoo.it
465 (ssl)
vostraemail@hotmail.com
vostraemail@hotmail.it
Non sono riuscito a far funzionare Swiftmailer con hotmail. Sono ben accetti commenti che possano rispondere alla questione.
vostraemail@alice.it out.alice.it 25

 

Infine, evitate assolutamente di impostare valori troppo alti per la dimensione massima degli allegati. Personalmente consiglio di non superare i 2-3 Mb. Infatti, ciò rallenta di molto l'operazione di invio e nei casi peggiori (con file pittosto grandi) si rischia superare il tempo massimo di esecuzione dei file (direttiva max_execution_time del php.ini) e andrà a generarvi il seguente errore:

Fatal error: Maximum execution time of 60 seconds exceeded ...

 

Invio email tramite Swiftmailer

Il file send.php si occuperà di inviare l'email. 

// se il form e' stato inviato...
if(isset($_POST['invia'])){
	/************************************/
	/* VARIABILE PER GESTIRE GLI ERRORI */
	/************************************/
	// la impostiamo FALSE 
	// se durante la procedura diventa vera la modifichiamo in TRUE
	$error = FALSE;
	
	/********************************/
	/* RICEVIAMO GLI INPUT DAL FORM */
	/********************************/
	$nome = isset($_POST['nome']) ? trim( (string) $_POST['nome']) : '';
	$oggetto = isset($_POST['oggetto']) ? trim( (string) $_POST['oggetto']) : '';
	$email = isset($_POST['email']) ? trim( (string) $_POST['email']) : '';
	$messaggio = isset($_POST['messaggio']) ? trim( (string) $_POST['messaggio']) : '';

	
	/************************************/
	/* VERIFICHIAMO I CAMPI OBBLIGATORI */
	/************************************/
	if( $nome=='' ) {
		$error = TRUE;
		$msg = 'Il campo nome è obbligatorio!';
		}
	else if( $oggetto=='' ){
		$error = TRUE;
		$msg = 'Il campo oggetto è obbligatorio';
		}
	else if( !preg_match('/^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)+$/', $email) ){
		$error = TRUE;
		$msg = 'Il campo email è obbligatorio. Verifica di averlo digitato correttamente.';
		}
	else if( $messaggio=='' ){
		$error = TRUE;
		$msg = 'Il campo messaggio è obbligatorio';
		}
	// siccome i campi obbligatori sono ok possiamo procedere a comporre lemail
	else{
	
		/************************************************************/
		/* INCLUDIAMO SWIFTMAILER E IL NOSTRO FILE DI CONFIGURAZIONE*/
		/************************************************************/
		require_once('lib/swift_required.php');
		require_once('config.php');
		
		
		/*****************************************************************/
		/* IMPOSTIAMO IL SERVER SMTP CHE SI OCCUPERA' DI INVIARE L'EMAIL */
		/*****************************************************************/
		// i dati SMTP presenti nel config
		if( (PORT_SMTP != FALSE) AND ( SECUTITY_SMTP != FALSE ) ){
			$transport = Swift_SmtpTransport::newInstance(HOST_SMTP, PORT_SMTP, SECUTITY_SMTP);
			}
		else if( PORT_SMTP != FALSE ){
			$transport = Swift_SmtpTransport::newInstance(HOST_SMTP, PORT_SMTP);
			}
		else{
			$transport = Swift_SmtpTransport::newInstance(HOST_SMTP);
			}
			
		$transport->setUsername(EMAIL_SMTP);
		$transport->setPassword(PASSWORD_SMTP); 
	
		$mailer = Swift_Mailer::newInstance($transport);
	
	
		/***************************/
		/* COMPONIAMO IL MESSAGGIO */
		/***************************/
		$message = Swift_Message::newInstance($oggetto); // oggetto
		$message->setFrom(array($email => $nome)); // email e nome di provenienza
		$message->setTo(array(EMAIL_DESTINATARIO)); // destinatario/i soto forma di array
		$message->setBody($messaggio,'text/html');  // corpo del messaggio
	
		// http://forums.devnetwork.net/viewtopic.php?f=52&t=98225&p=531623
		$message->setReturnPath(EMAIL_SMTP);
		
		/************/
		/* ALLEGATO */
		/************/
		// se esiste l'allegato
		if( (isset($_FILES["allegato"])) AND ($_FILES["allegato"]['name'] != '') ){
			// indichiamo le tipologie di file consentiti
			$tipologie_consentite = array('jpg', 'jpeg', 'png', 'gif', 'doc', 'pdf', 'xls', 'zip', 'rar'); // tutto minuscolo
			$path_info = pathinfo($_FILES["allegato"]['name']);
			
			// se si e' verificato un errore nell'upload...
			if(!is_uploaded_file($_FILES["allegato"]['tmp_name'])){ 				
				$error = TRUE;
				$msg = 'Si è verificato un errore durante il caricamento del file!';
				}
			else if(!in_array(strtolower($path_info['extension']), $tipologie_consentite)){
				$error = TRUE;
				$msg = 'Il file non è fra i tipi consentiti!';
				}
			// se supera la dimensione massima consentita
			else if($_FILES["allegato"]['size'] > MAX_DIM_FILE){
				// supera la dimensione massima consentita...
				$error = TRUE;
				$msg = 'Il file allegato eccede la dimensione massima consentita!';
				}
			// altrimenti andiamo ad allegare il file
			else{			
				$attachment = Swift_Attachment::fromPath($_FILES["allegato"]['tmp_name']); 
				$attachment->setFilename($_FILES["allegato"]['name']); 
				$message->attach($attachment);
				}
			}
		}

		
	/**************************************************/	
	/*SE NON SI SONO VERIFICATI ERRORI INVIAMO L'EMAIL*/
	/**************************************************/
	if($error === FALSE){
		$result = $mailer->send($message);
		if($result>0){
			$msg = "Email inviata. Presto sarai ricontattato.";
			}
		else{
			$msg = "Problemi nell'invio della email!";
			}
		}

		
	/*********************************/
	/* REDIRECT ALLA PAGINA DEL FORM */
	/*********************************/
	$get_var = urlencode($msg);
	header('location: contact.php?msg=' . $get_var);
	exit;
  }
?>

 

Come potete notare il codice è ampiamente commentato ed autoesplicativo. 

 

Considerazioni finali

La prima considerazione che occorre fare è che non tutti gli hosting (in particolare quelli gratuiti) consentono di inviare email in modalità SMTP (ed in particolare uno di questi è Altervista). In quel caso lo script vi andrà a generare un FATAL ERROR.

 

Questione piuttosto complessa riguarda l'indirizzamento delle email nella cartella di posta indesiderata: a questo proposito non esiste una soluzione definitiva. Infatti, tutto dipenderà del provider destinatario della email. Lo stesso messaggio potrebbe essere considerato spam da hotmail metre potrebbe essere considerato perfettamente valido per gmail e viceversa. Vi sono a tal proposito delle linee guida che si consiglia di seguire all'interno della documentazione ufficiale di Swiftmailer.

 

Infine, ponete attenzione agli allegati che vi vengono inviati tramite il vostro contact form eseguendo una scansione del file con un antivirus.

 

Per qualsiasi problema o dubbio non esitate a lasciare un commento.

DOWNLOAD

Olimpio Romanella

Sono un appassionato di Web Developing con un particolare debole per php. Mi dedico principalmente dello sviluppo back-end ed in particolare programmazione lato server con php, sviluppo di database relazionali MySql e progettazione di CMS di piccole e medie dimensioni.

Mi avvalgo del framework javascript Jquery, utilizzando molti dei suoi plugin e nei dei miei progetti utilizzo spesso il framework MVC Codeigniter.

14 Commenti presenti

avatar no instagram account?

no instagram account?

10 December 2016 ore 22:14

Hey there,
I was looking at your website I can't find your Instagram account link?
There are over 400 million active users on Instagram (more then twitter) and the people using this app are buyers!
I wrote an article on how you can setup your own account and get sales the same day! I have included case studies and a full “how to guide”
I also offer a done for you service that costs less then a meal out!
It does not matter if your a local business owner or someone that sells designer bags Instagram can get you clients and sales the same day as you set up your account
take a look at what all the fuss is about here
http://abouttrillions.com/services/instagram
Hope it helps.

avatar Johng94

Johng94

26 August 2014 ore 21:15

I have to agree with your statement with this issue and dfeabcgfdabc

avatar daniele

daniele

20 May 2014 ore 15:37

Ciao Sempre script super...grazie
ho un problema quando clicco su modifica le palore con gli accenti non compaiono nel form?
si può risolvere?
grazie ancora

avatar alessio

alessio

21 June 2013 ore 08:45

Buongiorno.. sempre io :-P. Ho riscaricato lo script. Reinstallato, risettato e niente.. fa sempre uguale. Se invio la mail senza l allegato non arriva.. nessuna idea? grazie di nuovo..

avatar alessio

alessio

20 June 2013 ore 17:46

In pratica compilando il form nei suoi campi ma tralasciando di caricare l'allegato mi dice comunque: mail inviata... solo che non arriva nessuna mail a meno che non si inserisca l'allegato..

http://www.0571foto.com/contatti/contactform/contact.php

grazie per l'aiuto ;-)

avatar oly82

oly82

20 June 2013 ore 17:02

@alessio: ciao. ho risto lo script e mi sembra strano quanto dici. Mi sapresti dire quale messaggio di restituisce?

avatar alessio

alessio

20 June 2013 ore 16:36

Buonasera sono io di nuovo... Purtroppo dopo numerosi tentativi di capire il perchè non sono riuscito ad arrivare alla soluzione. Senza l'allegato non mi invia la mail.. Se potete aiutarmi ve ne sarei grato.. saluti

avatar alessio

alessio

20 June 2013 ore 09:20

ciao ho provato ad utilizzare questo script. E' possibile che se non inserisco il file alegato non invii la mail? A me da questo problema..

avatar oly1982

oly1982

04 July 2012 ore 21:12

@Alessia: che errore ti restituisce?

avatar Alessia

Alessia

04 July 2012 ore 11:37

Ciao,

ho provato ad utilizzare lo script, tuttavia genera errore quando prova a caricare la pagina send.php... any ideas???

avatar fabio

fabio

01 June 2012 ore 09:50

Ciao, vorrei sapere solo una cosa: ho scaricato "contact_form_with_attachment"! Dunque, ora per averlo perfettamente funzionante, mi basta curarmi del FILE DI CONFIGURAZIONE e seguire, naturalmente, tutti i tuoi preziosi consigli sulla sicurezza e le CONSIDERAZIONI FINALI ?
Grazie per il tuo cortese aiuto.
Fabio

avatar Nicola

Nicola

28 March 2012 ore 18:22

Ciao, il messaggio che ricevo è:

Fatal error: Uncaught exception 'Swift_TransportException' with message 'Expected response code 250 but got code "501", with message "501 HELO requires valid address "' in C:\xampp\htdocs\Nicola\Swift-4.1.6\lib\classes\Swift\Transport\AbstractSmtpTransport.php:422 Stack trace: #0 C:\xampp\htdocs\Nicola\Swift-4.1.6\lib\classes\Swift\Transport\AbstractSmtpTransport.php(306): Swift_Transport_AbstractSmtpTransport->_assertResponseCode('501 HELO requir...', Array) #1 C:\xampp\htdocs\Nicola\Swift-4.1.6\lib\classes\Swift\Transport\EsmtpTransport.php(224): Swift_Transport_AbstractSmtpTransport->executeCommand('HELO [::1]??', Array, Array) #2 C:\xampp\htdocs\Nicola\Swift-4.1.6\lib\classes\Swift\Transport\AbstractSmtpTransport.php(323): Swift_Transport_EsmtpTransport->executeCommand('HELO [::1]??', Array) #3 C:\xampp\htdocs\Nicola\Swift-4.1.6\lib\classes\Swift\Transport\EsmtpTransport.php(272): Swift_Transport_AbstractSmtpTransport->_doHeloCommand() #4 C:\xampp\htdocs\Nicola\Swift-4.1.6\lib\classes\Swift\Transport\AbstractSmtpTran in C:\xampp\htdocs\Nicola\Swift-4.1.6\lib\classes\Swift\Transport\AbstractSmtpTransport.php on line 422

Ricevo lo stesso errore anche se imposto indirizzo mittente e destinatario diversi
Qualche idea sulla causa dell'errore? Grazie

/************************/
/* SETTING DELLO SCRIPT */
/************************/
define('HOST_SMTP', 'smtp.tiscali.it');
define('PORT_SMTP', 25); // FALSE, 25, 465, 587
define('SECUTITY_SMTP', FALSE); // FALSE, ssl, tsl
define('EMAIL_SMTP', 'miamail@tiscali.it');
define('PASSWORD_SMTP', '********');
define('EMAIL_DESTINATARIO', 'miamail@tiscali.it');
define('MAX_DIM_FILE', 1048576); // 1mb = 1048576 byte

avatar oly1982

oly1982

28 January 2012 ore 16:36

Non conta dove è ospitato il sito (aruba o altrove).

Le impostazioni del file config.php HOST_SMTP, PORT_SMTP, SECUTITY_SMTP, EMAIL_SMTP, PASSWORD_SMTP servono ad impostare il provider di posta elettronica che si occuperà di inviare la email. Questo può anche coincidere (ma non consiglio) con la casella email in cui desideri ricevere le email inviate tramite il contact form.

L'email che hai lasciato in questo commento utilizza come provider alice (la stessa dell'esempio!!). Se vuoi utilizzare tale provider ti basterà modificare il file di esempio indicando la tua email (EMAIL_SMTP) e la password di accesso alla casella di posta (PASSWORD_SMTP).

Questione distinta è invece l'indicazione dell'email destinataria della posta inviata tramite il contact form.

avatar Walter

Walter

28 January 2012 ore 10:13

Il mio sito è su aruba, come dovrei configurare i file config.php? Io vorrei impostare come indirizzo destinatario un email fissa, la imposto nell'eamil destinatario? (sempre nel file config). ma la email smtp cosa sarebbe?
grazie