19 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', '[email protected]');
define('PASSWORD_SMTP', '********');
define('EMAIL_DESTINATARIO', '[email protected]');
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
[email protected]gmail.com smtp.gmail.com 465 (ssl)
[email protected]yahoo.com
[email protected]yahoo.it
smtp.mail.yahoo.com
smtp.mail.yahoo.it
465 (ssl)
[email protected]hotmail.com
[email protected]hotmail.it
Non sono riuscito a far funzionare Swiftmailer con hotmail. Sono ben accetti commenti che possano rispondere alla questione.
[email protected]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.

19 Commenti presenti

avatar Philip

Philip

19 October 2019 ore 16:37

Hello,

My name is Philip Lucas, I want to know if: You Need Leads, Sales, Conversions, Traffic for your site miniscript.it ?

I will Find Leads that Buy From You !

I will Promote Your Business In Any Country To Any Niche !

SEE FOR YOURSELF==> http://bit.ly/Promote_Very_Efficiently

Do not forget to read Review to convince you, is already being tested by many people who have trusted it !!

Kind Regards,
Philip Lucas



UNSUBSCRIBE==> http://bit.ly/Unsubscribe_Sales

avatar Marco

Marco

10 October 2019 ore 12:01

Good day! Since you're reading this message then you've proved that advertising through contact forms works! We can send your promotional message to people via their contact us form on their website. The advantage of this type of advertising is that messages sent through contact forms are automatically whitelisted. This increases the chances that your message will be seen. Absolutely NO Pay per click costs! Pay one flat rate and reach millions of people. For details please reply to: [email protected]

avatar Marco

Marco

07 July 2019 ore 04:09

Ciao,

Stavo navigando su internet quando per caso sono capitato sul tuo sito.
Innanzitutto complimenti per il design, per la struttura e per i contenuti di ottima qualit.

Mi sono permesso di analizzare un po lo stato del tuo sito con i miei vari tool SEO per vedere se  possibile migliorare il posizionamente del sito sui motori di ricerca.
Ho notato che ha fatto un buon lavoro per quanto riguarda l'ottimizzazione testi dentro il sito ma vedo che sarebbe possibile migliorare drasticamente i link in entrata sul sito.

Io credo fortemente che con una leggera spinta in pi potresti migliorare la posizione del tuo sito sulle SERP, ovvero sui risultati dei motori di ricerca.
Google principalmente ma anche Bing e Yahoo che sono ottimi motori di ricerca.

Faccio parte del team di Domaindiffusion.com e siamo leader in Italia per quanto riguarda la creazione di backlinks a profilo naturale.
Con profilo naturale intendo appunto backlinks che si crearebbero automaticamente durante il corso del tempo.

Molti oggigiorno vendono principalmente guest posts, ma avere il sito composto da solo link di origine guest post  uno sbaglio terribile che pu portare persino alla penalizzazione del sito.

Ecco perch noi ci concentriamo su tutti i tipi di backlinks:
Ovvero:

- Backlinks contestuali su siti nazionali/internazionali (link inseriti dentro un articolo scritto da noi rilevante alla tua nicchia).
- Propriet Web 2.0 tipo WordPress.com, Tumblr.com, Minds.com.
- BackLinks da Social Networks famosi e non famosi.
- BackLinks da commenti su blog o guestbooks.
- BackLinks da profili forum.
- BackLinks da articoli lasciati su forum.
- BackLinks Wiki.
- BackLinks .edu o .gov.
- BackLinks statistica.
- Backlinks da article directory.

E tanto altro ancora.
Dopo aver creato un profilo naturale di questo genere Google valorizzer e posizioner il tuo sito molto pi in alto di prima.
Per avere un idea sui prezzi e pacchetti disponibili basta che vai su domaindiffusion.com
Se vuoi parlarne o vorresti capire meglio che tipo di backlink creiamo rispondimi su [email protected] e ti risponder subito :)

Spero di non essermi allungato troppo e buona fortuna con il tuo sito in ogni caso!

avatar Marcia

Marcia

03 April 2019 ore 10:33

Hi there

I just checked out your website miniscript.it and wanted to find out if you need help getting Quality Organic Traffic that Buy From You?

I WILL PROVIDE ORGANIC TRAFFIC BY KEYWORD FROM SEARCH ENGINES IN ANY COUNTRY DESIRED !!
- TRAFFIC SAFE FOR YOUR SITE 100%
- All Country - for Basic packages (top country)
- Country Desire - for Standard & Premium packages
- Bounce Rate - very low
- Visit Duration - up to 5 minutes (long perioad)
- Pages Visited - 3-4 pages minimum
- Adsense - 100% SAFE
- Analytics - 100% trackable
- SERP Improvement - 100% SAFE
- Get Revenue from CPM - 100% SAFE
- Custom tracking provided

CLAIM YOUR FREE TRIAL TODAY ==> http://bit.ly/Quality_Organic_Traffic

Do not forget to read Review to convince you, is already being tested by many people who have trusted it !!

Regards,
AxyyKo

avatar Cath

Cath

18 March 2019 ore 10:21

Hello

Is your website copy outdated?

I'm a top-rated copywriter (with hundreds of happy clients) and a 100% job satisfaction rate and I'd like to write some copy for your website.

Enough about me, how does that help you?

The right words attract people.

They can even elevate your business above the competition.

I craft them into engaging content that search engines and people love.

What does that mean for you?

More traffic, more customers and a bright future for your business.

If you're open to it, I'd like to handle a small writing task so you can see the quality of work that I offer. Then we can see if it would be a good match.

Learn more on my website: https://offer.kathreadwrites.net/us-promo/ (Get $50 off your next article)

Stay Awesome,

Cath

P.S.I spend most of my time writing copy for clients. This means I try to avoid emails if possible. I do, however, prioritize existing clients & any new website inquiries. These get a FAST response. If you want to get in touch, please use the contact form on my website instead of emailing me.

Unsubscribe: https://offer.kathreadwrites.net/unsub/?ca=KRW&dom=miniscript.it

avatar Michela

Michela

01 February 2018 ore 10:02

Ciao e grazie per il lavoro molto utile e ben spiegato.

Ho una domanda: sto testando il form inserendolo a fondo pagina ma a ogni submit la pagina esegue una sorta di refresh e viene visualizzato il top della pagina, quindi ogni messaggio di success sent o validation immediatamente sopra il form non viene più visualizzato (insieme allo stesso form trovandosi il tutto a fondo pagina).

Qualche consiglio su come evitare il problema?

Pagina test form: http://www.demaniomarittimo.com/offerta-lavoro/offerta-lavoro.php

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', '[email protected]');
define('PASSWORD_SMTP', '********');
define('EMAIL_DESTINATARIO', '[email protected]');
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