Come inviare un form con php utilizzando phpmailer

Per l’invio di questo form con php useremo una delle più note librerie chiamata phpmailer. Ovviamente se usate un qualsiasi framework come laravel o similare non ci sarà bisogno di usare phpmailer in quanto quasi tutti i framework integrano un workflow di invio mail nativo.

Questo articolo si rivolge a tutti coloro che hanno l’esigenza di integrare un form php su, ad esempio, un progetto standalone statico come possono essere ad esempio landing pages o siti che non hanno ancora un supporto dinamico come cms o framework.

Il primo passo è installare le dipendenze. Spostiamoci da terminale nella cartella del nostro progetto (cd /tua/cartella/nomeprogetto) e andiamo a digitare come segue:

composer require phpmailer/phpmailer

Se avete già un file composer.json andate ad aggiungere invece la seguente dipendenza:

"phpmailer/phpmailer": "~6.0"

e andate ad aggiornare:

composer update

A questo punto avrete scaricato in locale phpmailer nelle dipendenze.

Script server side di invio form con php

Una volta strutturato il form html con submit impostato su POST, andiamo a vedere l’engine di invio vero e proprio analizzandolo passo passo.

Create un nuovo file e chiamatelo EngineForm.php. Dovrete far puntare il vostro form html di invio a questo file.

Ecco il codice completo di EngineForm.php:

<?php
//Namespace
use PHPMailer\PHPMailer\PHPMailer;

//SMTP TIMEZONE
date_default_timezone_set('Etc/UTC');

//La cartella vendor è stata generata da composer.
require 'vendor/autoload.php';

	//TEMPLATE CONFIG
	$siteUrl= "";
	$siteName = "";
	$siteLogo = "";

	//CONFIG
	$siteEmail = "";
	$siteSMTPFrom = "";
	$siteSMTPReplyTo = "";

	//SERVER CONFIG
	$siteHost = "";
	$siteSMTPUser = "";
	$siteSMTPPass = "";


	//VARIABLES FORM
	$nome = $_POST['name'];
	$cognome = $_POST['surname'];
	$email = $_POST['email'];
	$privacy = $_POST['privacy'];
	$messaggio = $_POST['message'];


	//SMTP EMAIL RICHIESTA
	$mail = new PHPMailer;
	$mail->isSMTP();
	//Enable SMTP debugging
	// 0 = off (for production use)
	// 1 = client messages
	// 2 = client and server messages
	$mail->SMTPDebug = 2;
	$mail->Host = ''.$siteHost.'';
	$mail->Port = 25;
	$mail->SMTPAuth = true;
	$mail->Username = ''.$siteSMTPUser.'';
	$mail->Password = ''.$siteSMTPPass.'';
	$mail->setFrom(''.$siteSMTPFrom.'', ''.$siteName.'');
	$mail->addReplyTo(''.$siteSMTPReplyTo.'', ''.$siteName.'');
	$mail->addAddress(''.$siteEmail.'', ''.$siteName.'');

	$mail->Subject = 'Richiesta contatto - '.$siteName.' ';


    $message = file_get_contents('richiesta.html');
    $message = str_replace('%NOME%', $nome, $message);
    $message = str_replace('%COGNOME%', $cognome, $message);
    $message = str_replace('%EMAIL%', $email, $message);
    $message = str_replace('%PRIVACY%', $privacy, $message);
    $message = str_replace('%MESSAGGIO%', $messaggio, $message);
    $message = str_replace('%SITETITLE%', $siteName, $message);
    $message = str_replace('%SITEURL%', $siteUrl, $message);
    $message = str_replace('%SITELOGO%', $siteLogo, $message);

    $mail->msgHTML($message);

	$mail->AltBody = ''.$siteName.'';

	//CONFERMA O ERRORI
	if (!$mail->send()) {
	    echo 'Mailer Error: ' . $mail->ErrorInfo;
	} else {
	    echo 'Message sent!';
	}
	//FINE EMAIL RICHIESTA

	//GENERO RICEVUTA PER IL CLIENTE
	$ricevuta = new PHPMailer;
	//Tell PHPMailer to use SMTP
	$ricevuta->isSMTP();

	//Enable SMTP debugging
	// 0 = off (for production use)
	// 1 = client messages
	// 2 = client and server messages
	$ricevuta->SMTPDebug = 2;
	$ricevuta->Host = ''.$siteHost.'';
	$ricevuta->Port = 25;
	$ricevuta->SMTPAuth = true;
	$ricevuta->Username = ''.$siteSMTPUser.'';
	$ricevuta->Password = ''.$siteSMTPPass.'';
	$ricevuta->setFrom(''.$siteSMTPFrom.'', ''.$siteName.'');
	$ricevuta->addReplyTo(''.$siteSMTPReplyTo.'', ''.$siteName.'');

	//Set who the message is to be sent to
	$ricevuta->addAddress(''.$email.'', ''.$cognome.' '.$nome.'');

	//Set the subject line
	$ricevuta->Subject = 'Grazie per averci contattato - '.$cognome.' '.$nome.'';

	$messagericevuta = file_get_contents('ricevuta.html');
	$messagericevuta = str_replace('%NOME%', $nome, $messagericevuta);
	$messagericevuta = str_replace('%COGNOME%', $cognome, $messagericevuta);
	$messagericevuta = str_replace('%SITETITLE%', $siteName, $messagericevuta);
	$messagericevuta = str_replace('%SITEURL%', $siteUrl, $messagericevuta);
	$messagericevuta = str_replace('%SITELOGO%', $siteLogo, $messagericevuta);

	$ricevuta->msgHTML($messagericevuta);

	//Replace the plain text body with one created manually
	$ricevuta->AltBody = ''.$siteName.'';

	if (!$ricevuta->send()) {
	    echo 'RICEVUTA Mailer Error: ' . $ricevuta->ErrorInfo;
	} else {
	    echo 'RICEVUTA Message sent!';
	}
	//FINE RICEVUTA

	//Success INVIO - SOLO SE USATE UN FORM AJAX
        /*
	return json_encode(array(
	'status' => 200, 
	'message' => 'success'
	));*/

Andiamo ad analizzare passo passo il codice:

La prima parte del codice va a settare il namespace e va a caricare le librerie precedentemente scaricate tramite composer:

//Namespace
use PHPMailer\PHPMailer\PHPMailer;

//SMTP TIMEZONE
date_default_timezone_set('Etc/UTC');

//La cartella vendor è stata generata da composer.
require 'vendor/autoload.php';

Successivamente andiamo a impostare le variabili come ad esempio la lista delle richieste POST, l’email di destinazione dove mandare la richiesta alcuni altri dati utili come il nome del sito, logo etc. Molte di queste variabili saranno utilizzate, successivamente, nel template di invio.

        //TEMPLATE CONFIG
	$siteUrl= "";
	$siteName = "";
	$siteLogo = "";

	//CONFIG
	$siteEmail = "";
	$siteSMTPFrom = "";
	$siteSMTPReplyTo = "";

	//SERVER CONFIG
	$siteHost = "";
	$siteSMTPUser = "";
	$siteSMTPPass = "";


	//VARIABLES FORM
	$nome = $_POST['name'];
	$cognome = $_POST['surname'];
	$email = $_POST['email'];
	$privacy = $_POST['privacy'];
	$messaggio = $_POST['message'];

A questo punto andiamo a creare una nuova email andando a impostare:

$mail = new PHPMailer;

Nel nostro caso useremo SMTP (ve lo consiglio), pertanto passiamo a $mail i dati per collegarsi:

	$mail->Host = ''.$siteHost.'';
	$mail->Port = 25;
	$mail->SMTPAuth = true;
	$mail->Username = ''.$siteSMTPUser.'';
	$mail->Password = ''.$siteSMTPPass.'';
	$mail->setFrom(''.$siteSMTPFrom.'', ''.$siteName.'');
	$mail->addReplyTo(''.$siteSMTPReplyTo.'', ''.$siteName.'');
	$mail->addAddress(''.$siteEmail.'', ''.$siteName.'');

Con mail->Subject andiamo a impostare l’oggetto della mail.

A questo punto non ci resta che comporre il “body” della mail. Per farlo abbiamo vari modi, quello più comodo è quello di includere un file html esterno e andare a sostituire le variabili al suo interno con i valori dinamici passati dal form.

    $message = file_get_contents('richiesta.html'); // Temaplte html esterno.
    //Vado a sostituire le variabili dinamiche con i dati del form
    $message = str_replace('%NOME%', $nome, $message);
    $message = str_replace('%COGNOME%', $cognome, $message);
    $message = str_replace('%EMAIL%', $email, $message);
    $message = str_replace('%PRIVACY%', $privacy, $message);
    $message = str_replace('%MESSAGGIO%', $messaggio, $message);
    $message = str_replace('%SITETITLE%', $siteName, $message);
    $message = str_replace('%SITEURL%', $siteUrl, $message);
    $message = str_replace('%SITELOGO%', $siteLogo, $message);

    $mail->msgHTML($message);
   
    $mail->AltBody = ''.$siteName.'';

Ripetete il procedimento nel caso vogliate inviare più di una mail (in questo esempio invio anche una ricevuta a chi scrive del tipo “grazie per averci contattato”).

Per finire andiamo a triggerare l’invio, con listener degli errori eventuali.

        if (!$ricevuta->send()) {
	    echo 'RICEVUTA Mailer Error: ' . $ricevuta->ErrorInfo;
	} else {
	    echo 'RICEVUTA Message sent!';
	}
	//FINE RICEVUTA

Nel caso il vostro form utilizzi ajax vi invito ad aggiungere come ho messo nell’esempio un result code json in modo tale da avere la corretta risposta HTTP.

	//Success INVIO
	return json_encode(array(
	'status' => 200, 
	'message' => 'success'
	));

NOTA BENE:

Consiglio ovviamente di aggiungere un controllo recaptcha al fine di filtrare eventuali spammer. Se non sai come fare segui la guida completa che ho fatto poco tempo fa:

GUIDA INTEGRAZIONE DI GOOGLE RECAPTCHA ANTISPAM

Come vedete tutte le variabili dinamiche sono state messe con la sintassi %VARIABILE%. Potete personalizzare ovviamente il tutto come meglio vi aggrada.

Consiglio se utilizzate css di metterlo inline al posto di linkare a un file esterno css (potrebbe venir bloccato da qualche programma di posta o finire in spam!).

Template ricevuta del form di contatti php

File: ricevuta.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <title>%SITETITLE%</title>
  <style>
   /*CSS QUI*/
  </style>
</head>
<body>
  <div style="width: 640px; font-family: Arial, Helvetica, sans-serif; font-size: 16px; padding:45px;">

    <div align="center">
         <a href="%SITEURL%">
       	 <img src="%SITELOGO%" alt="%SITETITLE%" title="%SITETITLE%">
         </a>
  
        <h2>Grazie %COGNOME% %NOME% !</h2>
        <p>Grazie per averci contattato, verrai ricontattato il prima possibile dal nostro team!</p>

      </div>
  </div>
</body>
</html>

Template richiesta del form di contatti php

Ecco invece un comodo esempio di template pronto all’uso per la richiesta di contatto.

File: richiesta.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <title>%SITETITLE%</title>
 <style>
   /*CSS QUI*/
  </style>
</head>
<body>
<div style="width: 640px; font-family: Arial, Helvetica, sans-serif; font-size: 16px; padding:45px;">
<div align="center">

	       <a href="%SITEURL%">
	     	 <img src="%SITELOGO%" alt="%SITETITLE%" title="%SITETITLE%">
	       </a>

        <h2>Dati del lead</h2>
	<p><strong>Nome:</strong> %NOME%</p>
	<p><strong>Cognome:</strong> %COGNOME%</p>
	<p><strong>Email:</strong> %EMAIL%</p>
	<p><strong>Telefono:</strong> %TELEFONO%</p>
	<p><strong>Azienda:</strong> %COMPANY%</p>
	<p>Settore: %SETTORE%</p>
	<p>Partita Iva: %PIVA%</p>
	<p>Privacy Accettata</p>

	<h2>Messaggio</h2>
	<p>%MESSAGGIO%</p>
		
	</div>
  </div>
</body>
</html>

Questo articolo ti è stato utile? Condividilo sui tuoi social network preferiti.

Image credits “PHP” disponibile su Shutterstock.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

spam
Up Next:

Come installare Google Recaptcha sul vostro sito. Guida completa a Google Recaptcha.

Come installare Google Recaptcha sul vostro sito. Guida completa a Google Recaptcha.