Categories: PHP

Creare una Procedura per Invio di Newsletters

Per chi come me ha poche migliaia di indirizzi di posta elettronica da dover gestire, acquistare un complesso sistema di invio di newsletter sarebbe molto dispendioso a fronte del ritorno economico, quindi ho creato una pagina web dalla quale soltanto io posso spedire delle email ad un numero fisso di indirizzi.
L’ostacolo che dobbiamo superare per l’invio delle nostre newsletter con un semplice web hosting condiviso è il numero per tempo che occorre rispettare. Si tratta di un modo che hanno i provider di questi servizi per non essere inseriti nelle black list ed essere definiti come spam. Ad esempio nel mio caso ho la possibilità di inviare 300 email all’ora, quindi ho deciso di trattare blocchi di 200 indirizzi per volta.
Creiamo una nuova pagina PHP e la colleghiamo al database MySQL nel quale ci sono gli indirizzi a cui spedire le email. Salvaguardiamo il tutto con l’inserimento di una password, inseriamo una casella di testo per il corpo del messaggio e per ultimo il pulsante che scatenerà l’invio del messaggio.

<?php

   $strInfo = $_REQUEST['regpers'];
   $strIniziaZero = $_REQUEST['deleteall'];

   $bIniziaZero = false;
   if (strlen($strIniziaZero) > 0 && $strIniziaZero == "on")
    $bIniziaZero = true;

   $totUte = 0;
   $maxInvio = 200;

   require_once('connessione.php');
   mysql_select_db($database, $mydata);

   $query = "SELECT * FROM Utenti WHERE Inviato = 0
           AND Attivo = 1";
   $utenti = mysql_query($query, $mydata) or
           die(mysql_error());
   $uteRow = mysql_fetch_assoc($utenti);
   $totUte = mysql_num_rows($utenti);
   mysql_free_result($utenti);

   if (strlen($strInfo) > 0)
   {
 $strPws = $_REQUEST['pws'];
 if (strlen($strPws) <= 0)
 {
      mysql_close($mydata);
    exit();
 }
 if ($strPws != "mypassword")
 {
    mysql_close($mydata);
    exit();
 }

 if ($strInfo == "myinvio")
 {
    $strInfo = $_REQUEST['notizia'];
    if (strlen($strInfo) > 0)
    {
  if ($bIniziaZero)
  {
      // elimino gli invii
     $query = "UPDATE Utenti SET Inviato = 0";
     mysql_query($query, $mydata) or
                      die(mysql_error());
  }

  $strHeaders = "From: noreply@miodominio.it\n";
  $strHeaders .= "X-Mailer: Mia Azienda Notizie\n";
  $strHeaders .= "MIME-Version: 1.0\n";
  $strHeaders .= "Content-Type: text/html\n\n";

  $strMsg = '<br><br><p align="left">
                Riceve questa E-Mail perchè
                 abbonato a Mia Azienda, se desidera
                       interrompere il servizio si prega di
                       fare click su ';

   $realSend = 0;

   $query = "SELECT IDUtente, EMail FROM
                             Utenti WHERE Inviato = 0 
                             AND Attivo = 1 LIMIT 0,$maxInvio";
   $posta = mysql_query($query, $mydata) or
                             die(mysql_error());
   $postaRow = mysql_fetch_assoc($posta);
   $postaNum = mysql_num_rows($posta);

   for ($i = 0; $i < $postaNum; ++$i)
   {
      $strMessage = $strInfo.$strMsg.'
      <a href="http://www.miodominio.it/
                                cancnews.php?idnotizia=XXXXXX'.
      $postaRow['IDUtente'].'XXXXX">questo
                                collegamento</a></p></body>
                                </html>';
      if (!mail(strtolower(
                                $postaRow['EMail']), "Notizie da
                                Mia Azienda", $strMessage,
                                $strHeaders))
      {
         $bMailError = true;
         break;
      }

      $query = "UPDATE Utenti
                            SET Inviato = 1 WHERE IDUtente = ".
                            $postaRow['IDUtente'];
      mysql_query($query, $mydata) or
                            die(mysql_error());

      $realSend++;

      $postaRow = mysql_fetch_assoc($posta);
   }

   mysql_free_result($posta);

   if ($bMailError)
      $strInfo .= " ERRORE!!!!!";

   mail("mioindirizzo@miodominio.it",
                          "Inviata a ".$realSend." utenti",
                          $strInfo.$strMsg."questo collegamento.
                          </body></html>", $strHeaders);
     }
      }
 }

 mysql_close($mydata);

?>

<html>
<head><title>Invio Notizie</title></head>
<body>

<h1 align="center">Invio Notizie</h1>

<?php echo '<h1 align="center">Utenti che devono avere la
              notizia: '.$totUte.'</h1>'; ?>

<div align="center">
<form action="#" method="POST" name="news">

 <input name="pws" type="password" id="pws"
         title="Inserire la password" size="20" maxlength="20">
 <br><br>
 <input name="deleteall" type="checkbox" id="deleteall"
             title="Cancella tutte le spedizioni prima di
             inviare">Inizia da Zero
 <br><br>
 <textarea name="news" type="text" title="News"
          id="notizia" cols="60" rows="20"><html><body></textarea>
 <br><br>
 <input name="regpers" type="hidden" id="regpers"
                value="myinvio">
 <input type="submit" name="invia" id="invia"
               title="Invio" value="Invia">

</form>
</div>

</body>
</html>

Per sicurezza ho inserito una password da sapere per poter inviare i messaggi ed anche una variabile che consente di inviare le email solo se si inviano le richieste dalla stessa pagina. Il programma mi sembra abbastanza chiaro, una volta inviati i messaggi, gli utenti vengono etichettati con un campo booleano positivo, inoltre abbiamo un altro campo per gestire coloro che si vogliono cancellare dall’invio. Se aveste proposte di estensione dell’esempio oppure avete notato qualche errore potete segnalarlo tramite i commenti o il nostro forum.

Share
Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.

Published by
Giampaolo Rossi
Tags: MySQL

Recent Posts

MerciGest: il gestionale di magazzino semplice e gratuito

MerciGest è il software gestionale gratuito per Windows che semplifica la gestione del magazzino: giacenze,…

2 settimane ago

Software gestionali con SQL Server: un archivio unico, accessibile ovunque

Tutti i nostri software gestionali possono essere collegati a un database SQL Server, consentendo l’accesso…

2 settimane ago

Come iniziare ad usare MerciGest in 5 minuti

MerciGest è semplice e immediato: basta scaricare e installare il programma per iniziare subito. Al…

2 settimane ago

Cos’è MerciGest e a chi serve

MerciGest è un gestionale di magazzino per Windows pensato per negozi, piccole imprese e artigiani…

3 settimane ago

Introduzione alla Standard Template Library (STL)

La Standard Template Library (STL) è una delle componenti più potenti del C++. Fornisce una…

8 mesi ago

Un Abbonamento per Tutti i Software

Sono arrivato alla convinzione che un abbonamento per tutti i miei software gestionali sia il…

2 anni ago