Come inviare messaggi di testo con PHP
() 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
esmsMessage
sono state inviate. Questo è utile nel caso in cui ci possono essere più di un forma nella pagina. - Se
phoneNumber
,carrier
esmsMessage
sono disponibili ephoneNumber
ecarrier
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 funzionewordwrap
. -
phoneNumber
ecarrier
sono concatenati e quindi il messaggio viene inviato utilizzando la funzionemail
. - 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!