Advertisement
  1. Code
  2. PHP
  3. PHP Scripts

Come inviare messaggi di testo con PHP

Scroll to top

() translation by (you can also view the original English article)

I messaggi di testo sono diventati estremamente diffusi in tutto il mondo..--al punto che un numero sempre crescente di applicazioni web hanno integrato SMS per inviare notifiche agli utenti per eventi, vendite o coupon direttamente attraverso i loro dispositivi mobili.

In questo tutorial, parleremo dei principi per inviare dei messaggi di testo con PHP.


Panoramica

L'invio di un messaggio di testo (SMS) è in realtà piuttosto semplice.

Di seguito ecco un diagramma semplificato di come un messaggio può essere inviato da un'applicazione web a un dispositivo wireless.

Noi vedremo questo -- un pezzo alla volta:

  • Il messaggio è composto utilizzando un'applicazione web che viene memorizzata ed eseguita su un server HTTP e quindi inviato tramite internet ("the cloud") come email.
  • L'email viene ricevuto da un Short Message Service Gateway (Gateway SMS), che converte il messaggio da email a messaggio SMS.
  • Il messaggio SMS viene quindi passato a un Short Message Service Center (SMSC), che è un server che distribuisce i dati a dispositivi mobili specifici.
  • Il messaggio viene infine trasmesso tramite la rete wireless al destinatario.

La maggior parte delle reti wireless dispone di un gateway SMS attraverso il quale le email possono essere inviate come messaggi di testo a un dispositivo mobile. Questo è bello, perché, dal punto di vista di uno sviluppatore, è generalmente gratuito — ma non è normalmente un servizio gratuito per l'utente finale. Il pagamento potrebbe essere applicato al destinatario del messaggio e i messaggi inviati via email saranno fatturati come messaggio di testo non di rete.


Da Email a SMS

Per inviare un SMS via email, bisogna avere solo due cose:

  • Il numero di telefono o l'identificatore univoco del dispositivo mobile che si desidera raggiungere.
  • E il nome di dominio della rete wireless (molti si trovano in questo elenco di email verso indirizzi SMS)

La seguente convenzione può essere eseguita per la maggior parte dei casi:

1
phoneNumber@domainName.com

phoneNumber è il numero di telefono del dispositivo a cui inviare il messaggio, e domainName.com è l'indirizzo del Gateway SMS della rete.

Per inviare un testo al signor Example, si potrebbe semplicemente aggiungere 3855550168@vtext.com a qualsiasi client email, digitare un messaggio e premere Invia. Questo invierà un messaggio di testo al numero di telefono +1 (385) 555-0168 sulla rete Verizon Wireless.

Ad esempio, mi mando un SMS utilizzando Gmail.

Quando il telefono riceve il messaggio, dovrebbe apparire in questo modo:

Abbastanza impressionante!


La funzione mail di PHP

Facciamo un ulteriore passo in avanti. Utilizzando il Gateway SMS, possiamo inviare un messaggio di testo via email utilizzando la funzione mail di PHP. La funzione mail ha la seguente firma:

1
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

Potete leggere di più su di essa qui.

  • $to definisce il ricevitore o destinatario del messaggio. Esempi validi sono:

    • user@example.com
    • user1@example.com, user2@example.com
    • User<user@example.com>
    • User1 <user1@example.com>,User2 User2<user2@example.com>
  • $subject è piuttosto auto esplicativo; dovrebbe essere una stringa contenente l'oggetto desiderato. Tuttavia, gli SMS non richiedono un oggetto.
  • $message è il messaggio da inviare. Come indicato nel manuale di PHP, "ogni riga dovrebbe essere separata con un LF (\n). Le linee non dovrebbero essere maggiori di 70 caratteri."

Per replicare la funzionalità precedente, potremmo scrivere il seguente codice PHP:

1
mail( '3855550168@vtext.com', '', 'Testing' );

Un Test Drive

Facciamo un test con PHP per assicurarci che tutto sia configurato correttamente e che la funzione mail invii un messaggio di testo. Utilizzando il seguente codice, possiamo eseguire:

1
<?php
2
3
var_dump( mail( '##########@vtext.com', '', 'This was sent with PHP.' ) ); // bool(true)

4
5
?>

Quando il telefono riceve il messaggio, sembra così:

Se avete trovato un errore, vedere la sezione risoluzione dei problemi.

Come potete vedere nell'immagine sopra, il messaggio segnala che è da Gmail. Questo è perché indirizzo tutti i miei messaggi in uscita dal mio server locale attraverso tale servizio. Purtroppo, nel momento in cui scriviamo, non sono riuscito ad alterare l'intestazione From per visualizzare un indirizzo alternativo. Sembra che le intestazioni delle email siano spogliate e sostituite con intestazioni preparate dal gateway SMS. Se qualcuno conosce una soluzione, si prega di lasciare un commento farcelo sapere!


Aggiungere usabilità

Il Markup

Con le nozioni di base, prendiamo questa idea e includiamo un'interfaccia utente intorno ad essa. Prima impostiamo un semplice form:

1
<!DOCTYPE html>
2
 <head>
3
   <meta charset="utf-8" />
4
  </head>
5
  <body>
6
   <div id="container">
7
    <h1>Sending SMS with PHP</h1>
8
    <form action="" method="post">
9
     <ul>
10
      <li>
11
       <label for="phoneNumber">Phone Number</label>
12
       <input type="text" name="phoneNumber" id="phoneNumber" placeholder="3855550168" /></li>
13
      <li>
14
      <label for="carrier">Carrier</label>
15
       <input type="text" name="carrier" id="carrier" />
16
      </li>
17
      <li>
18
       <label for="smsMessage">Message</label>
19
       <textarea name="smsMessage" id="smsMessage" cols="45" rows="15"></textarea>
20
      </li>
21
     <li><input type="submit" name="sendMessage" id="sendMessage" value="Send Message" /></li>
22
    </ul>
23
   </form>
24
  </div>
25
 </body>
26
</html>

Lo stile

Mettiamo alcune regole CSS:

1
body {
2
 margin: 0;
3
 padding: 3em 0;
4
 color: #fff;
5
 background: #0080d2;
6
 font-family: Georgia, Times New Roman, serif;
7
}
8
9
#container {
10
 width: 600px;
11
 background: #fff;
12
 color: #555;
13
 border: 3px solid #ccc;
14
 -webkit-border-radius: 10px;
15
 -moz-border-radius: 10px;
16
 -ms-border-radius: 10px;
17
 border-radius: 10px;
18
 border-top: 3px solid #ddd;
19
 padding: 1em 2em;
20
 margin: 0 auto;
21
 -webkit-box-shadow: 3px 7px 5px #000;
22
 -moz-box-shadow: 3px 7px 5px #000;
23
 -ms-box-shadow: 3px 7px 5px #000;
24
 box-shadow: 3px 7px 5px #000;
25
}
26
27
ul {
28
 list-style: none;
29
 padding: 0;
30
}
31
32
ul > li {
33
 padding: 0.12em 1em
34
}
35
36
label {
37
 display: block;
38
 float: left;
39
 width: 130px;
40
}
41
42
input, textarea {
43
 font-family: Georgia, Serif;
44
}

Questo ci dà il semplice modulo seguente:


Lo Script

La parte più importante è lo script PHP. Scriveremo ora quel po' di codice:

1
<?php
2
3
if ( isset( $_REQUEST ) && !empty( $_REQUEST ) ) {
4
 if (
5
 isset( $_REQUEST['phoneNumber'], $_REQUEST['carrier'], $_REQUEST['smsMessage'] ) &&
6
  !empty( $_REQUEST['phoneNumber'] ) &&
7
  !empty( $_REQUEST['carrier'] )
8
 ) {
9
  $message = wordwrap( $_REQUEST['smsMessage'], 70 );
10
  $to = $_REQUEST['phoneNumber'] . '@' . $_REQUEST['carrier'];
11
  $result = @mail( $to, '', $message );
12
  print 'Message was sent to ' . $to;
13
 } else {
14
  print 'Not all information was submitted.';
15
 }
16
}
17
18
?>
19
<!DOCTYPE html>
  • Lo script verifica innanzitutto se il modulo è stato inviato.
  • Se sì, controlla per vedere se le variabili phoneNumber, carrier e smsMessage sono state inviate. Questo è utile nel caso in cui ci possono essere più di un forma nella pagina.
  • Se phoneNumber, carrier e smsMessage sono disponibili e phoneNumber e carrier non sono vuote, è bene tentare di inviare il messaggio.
  • L'argomento del messaggio nella funzione mail dovrebbe essere di 70 caratteri per riga. Noi possiamo tagliare il messaggio a blocchi di 70 caratteri utilizzando la funzione wordwrap.
  • phoneNumber e carrier sono concatenati e quindi il messaggio viene inviato utilizzando la funzione mail.
  • Se i dati sono mancanti o non può essere convalidato, lo script restituisce semplicemente Not all information was submitted.
  • Infine, mail restituisce un valore booleano che indica se è andato a buon fine o no. Nel caso in cui abbia bisogno di verificare che il messaggio sia stato inviato in realtà, il valore viene memorizzato in $result.

Nota: Il metodo mail notifica solo se il messaggio è stato inviato o meno. Esso non fornisce un modo per verificare se il messaggio è stato ricevuto correttamente dal server destinatario o dal mailbox.


Il codice finale

1
<?php
2
3
if ( isset( $_REQUEST ) && !empty( $_REQUEST ) ) {
4
 if (
5
 isset( $_REQUEST['phoneNumber'], $_REQUEST['carrier'], $_REQUEST['smsMessage'] ) &&
6
  !empty( $_REQUEST['phoneNumber'] ) &&
7
  !empty( $_REQUEST['carrier'] )
8
 ) {
9
  $message = wordwrap( $_REQUEST['smsMessage'], 70 );
10
  $to = $_REQUEST['phoneNumber'] . '@' . $_REQUEST['carrier'];
11
  $result = @mail( $to, '', $message );
12
  print 'Message was sent to ' . $to;
13
 } else {
14
  print 'Not all information was submitted.';
15
 }
16
}
1
?>
2
<!DOCTYPE html>
3
 <head>
4
   <meta charset="utf-8" />
5
   <style>
6
    body {
7
     margin: 0;
8
     padding: 3em 0;
9
     color: #fff;
10
     background: #0080d2;
11
     font-family: Georgia, Times New Roman, serif;
12
    }
13
14
    #container {
15
     width: 600px;
16
     background: #fff;
17
     color: #555;
18
     border: 3px solid #ccc;
19
     -webkit-border-radius: 10px;
20
     -moz-border-radius: 10px;
21
     -ms-border-radius: 10px;
22
     border-radius: 10px;
23
     border-top: 3px solid #ddd;
24
     padding: 1em 2em;
25
     margin: 0 auto;
26
     -webkit-box-shadow: 3px 7px 5px #000;
27
     -moz-box-shadow: 3px 7px 5px #000;
28
     -ms-box-shadow: 3px 7px 5px #000;
29
     box-shadow: 3px 7px 5px #000;
30
    }
31
32
    ul {
33
     list-style: none;
34
     padding: 0;
35
    }
36
37
    ul > li {
38
     padding: 0.12em 1em
39
    }
40
41
    label {
42
     display: block;
43
     float: left;
44
     width: 130px;
45
    }
46
47
    input, textarea {
48
     font-family: Georgia, Serif;
49
    }
50
   </style>
51
  </head>
52
  <body>
53
   <div id="container">
54
    <h1>Sending SMS with PHP</h1>
55
    <form action="" method="post">
56
     <ul>
57
      <li>
58
       <label for="phoneNumber">Phone Number</label>
59
       <input type="text" name="phoneNumber" id="phoneNumber" placeholder="3855550168" /></li>
60
      <li>
61
      <label for="carrier">Carrier</label>
62
       <input type="text" name="carrier" id="carrier" />
63
      </li>
64
      <li>
65
       <label for="smsMessage">Message</label>
66
       <textarea name="smsMessage" id="smsMessage" cols="45" rows="15"></textarea>
67
      </li>
68
     <li><input type="submit" name="sendMessage" id="sendMessage" value="Send Message" /></li>
69
    </ul>
70
   </form>
71
  </div>
72
 </body>
73
</html>

Risoluzione dei problemi

Errore di localhost

Per poter utilizzare la funzione mail, è necessario disporre di un server di posta in esecuzione. Se si esegue su un host web, probabilmente andrà bene. Ma se non siete sicuri, vi consiglio di parlare con un amministratore. Questo vale anche per le macchine personali. Quindi, se dà errori come...

1
Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\wamp\www\sms\mail-test.php

... è necessario installare e configurare un server di posta. Questo è fuori della portata di questo tutorial. Tuttavia, se si lavora sul computer locale, il passaggio a qualcosa come XAMPP potrebbe risolvere questo problema. In alternativa, provare a installare Mercury Mail accanto ad un sistema WAMP, MAMP o LAMP (o SAMP o OAMP, ecc.) (quante 'AMPs').

PHPMailer

Un'altra opzione (che è il metodo che preferisco) consiste nell'utilizzare PHPMailer. Di seguito è un esempio di come utilizzare PHPMailer per connettersi al server SMTP di Gmail e inviare il messaggio.

Utilizzarlo è semplice come includere una classe nello script.

1
require 'class.phpmailer.php';
2
3
// Instantiate Class

4
$mail = new PHPMailer();
5
6
// Set up SMTP

7
$mail->IsSMTP();                // Sets up a SMTP connection

8
$mail->SMTPDebug  = 2;          // This will print debugging info

9
$mail->SMTPAuth = true;         // Connection with the SMTP does require authorization

10
$mail->SMTPSecure = "tls";      // Connect using a TLS connection

11
$mail->Host = "smtp.gmail.com";
12
$mail->Port = 587;
13
$mail->Encoding = '7bit';       // SMS uses 7-bit encoding

14
15
// Authentication

16
$mail->Username   = "email.address@gmail.com"; // Login

17
$mail->Password   = "password"; // Password

18
19
// Compose

20
$mail->Subject = "Testing";     // Subject (which isn't required)

21
$mail->Body = "Testing";        // Body of our message

22
23
// Send To

24
$mail->AddAddress( "##########@vtext.com" ); // Where to send it

25
var_dump( $mail->send() );      // Send!

Questo dovrebbe stampare qualcosa sulla falsariga di:

Potrebbe richiedere un po' di più per impostare la connessione a seconda della situazione. Se pensate di utilizzare Gmail, Google ha fornito informazioni sulla connessione.


Conclusione

Ci sono una miriade di metodi per inviare un SMS tramite un'applicazione web. Questo metodo è davvero significavo per basso volume di messaggistica (probabilmente meno di 1.000 SMS al mese) e per gli sviluppatori che desiderano non sborsare denaro. Altre opzioni includono:

  • Usare un Provider di Gateway SMS

    • Facendo una ricerca Google restituirà un sacco di opzioni.
    • La maggior parte dei provider di gateway SMS includono un'API per l'invio di messaggi tramite un'applicazione web.
    • È possibile solitamente iscriversi al servizio per un prezzo ragionevole, supponendo che si intendano inviare almeno 1.000 messaggi SMS al mese.
    • È possibile noleggiare un numero di codice breve.
  • Usare un modem GSM

    • Questo può essere un modo costoso e lento di fare, dato che devi comprare un modem e avere un contratto con una rete wireless
    • Inoltre si dovrà utilizzare il set di comandi AT (Hayes).
  • Utilizzare una connessione diretta a una rete wireless, che richiederà qualche forte negoziazione e un sacco di soldi.

Questo tutorial non è una rassegna esaustiva di metodi per inviare dei messaggi di testo con PHP; ma un modo per iniziare! Spero che questo tutorial sia stato di vostro interesse. Grazie mille per la lettura!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.