Envoyer des SMS par HTTP [Farheen]
Par Damien, mardi 31 mai 2005 à 21:18 :: PHP :: #32 :: rss
1- Introduction
Le SMS (Short Message Service) est devenu une méthode de communication très populaire, utilisée en Europe et en Asie depuis les années 90, et devenant de plus en plus utilisée aux USA également.
Le SMS s'envoie généralement depuis un téléphone portable, mais peut également être envoyé par d'autres moyens, par exemple depuis un site web.
Bien qu'il soit possible d'envoyer des SMS par courriel, ce tutorial vous expliquera comment envoyer des SMS en utilisant le protocole HTTP, en PHP bien entendu.
2- Choix d'une passerelle SMS
Pour pouvoir envoyer des SMS, vous devez passer par un service d'envoi de SMS (passerelle SMS). Il existe une multitude de services, plus ou moins chers, avec ou sans abonnement. A vous de choisir ce qui vous convient le mieux, en fonction de vos besoins et du volume de SMS que vous allez envoyer.
Dans ce tutorial, nous utiliserons la passerelle TM4B, pour plusieurs raisons :
- Le mode simulation bien utile pour tester ses scripts
- Pas de frais d'installation, ni de frais d'abonnement
- Les prix sont très compétitifs (environ 6 centimes d'euro le SMS vers la France), et il n'y a pas de minimum d'achat (pas besoin d'acheter les SMS par pack de 50 ou plus)
- Fiable
Si vous cherchez une passerelle SMS en français, vous pouvez jeter un coup d'oeil du coté de http://www.lesms.com/, qui semble également assez intéressant, bien que plus cher.
Fonctionnement
Pour utiliser la passerelle TM4B, vous devez fournir 6 informations obligatoires :
- username : Notre identifiant
- password : Notre mot de passe
- type : broadcast (pour l'envoi de SMS)
- msg : Message(s) SMS. Message de 160 caractère maximum.
- to : Le(s) destinataire(s) du/des messages(s), séparés par | si il y en a plusieurs.
- from : Origine du message (numérique ou alphanumérique). Entre 8 et 15 caractères si numérique, sinon entre 1 et 11 caractères si alpha-numérique. First class uniquement.
- route : Le type de route du message ("first" = first class, "business" = business class). Pour l'envoi de SMS en France vous devez utiliser la business class. Voir le tableau pour l'europe.
Et vous pouvez également en utiliser une septième, optionelle, "sim". Si sa valeur est yes, notre message passe en mode simulation : aucun crédit n'est enlevé de votre compte, mais le SMS n'est pas envoyé.
Pour plus de détails, vous pouvez consulter leur page SMS API (anglais).
3- Envoyer des SMS
Préparer la requête
L'envoi du message est effectué par la passerelle SMS. Il suffit de leur communiquer les bonnes valeurs à l'aide d'une requête HTTP, en GET ou en POST.
Dans ce tutorial nous allons utiliser la méthode GET, voici un exemple de requête :
http://www.tm4b.com/client/api/http.php?type=broadcast&username=abcdef&password=12345&msg=Message+de+test&to=3361234567&from=MonSite&route=business&sim=yes
Vous pouvez tester cet exemple dans la barre d'adresse de votre navigateur. Vous obtenez un message d'erreur "Utilisateur invalide", c'est normal, c'est juste un test.
Voici comment construire cette requête en PHP :
<?php // initialisation des variables $requete = ''; $param['username'] = 'mon_identifiant'; // identifiant de notre compte TM4B $param['password'] = 'mon_motdepasse'; // mot de passe de notre compte TM4B $param['type'] = 'broadcast'; // envoi de sms $param['msg'] = 'Ceci est un message de test.'; // message que l'on désire envoyer $param['to'] = '33612345678|336'; // numéros de téléphones auxquels on envoie le message $param['from'] = 'MonSite'; // expéditeur du message (first class uniquement) $param['route'] = 'business'; // type de route (pour la france, business class uniquement) $param['sim'] = 'yes'; // on active le mode simulation, pour tester notre script // construction de la requete foreach($param as $clef => $valeur) // pour chaque champ { $requete .= '&'; } ?>
On enregistre nos paramètres dans le tableau $param. Vous pouvez noter que l'on peut envoyer le SMS à plusieurs destinataires, en séparant les numéros par le caractère |. Chaque valeur doit être encodée URL, et les paramètres sont séparés par le caractère &.
Le script ci dessus retourne la requête suivante :
username=mon_identifiant&password=mon_motdepasse&type=broadcast&msg=Ceci+est+un+message+de+test.&to=33612345678%7C336&from=MonSite&route=busi&sim=1
Envoyer la requête avec CURL
Nous avons vu que nous pouvons envoyer la requete en la copiant dans la barre d'adresse de notre navigateur, mais nous n'allons pas demander à l'utilisateur de le faire. Nous voulons que la requête soit envoyée automatiquement, depuis notre script PHP. Il y a de nombreuses façons de le faire, par exemple en utilisant CURL.
CURL est une bibliothèque complète qui permet de communiquer avec de nombreux serveurs, grâce à de nombreux protocoles. Vous pouvez trouver plus d'infos sur cette extension dans le manuel PHP. Notez que pour utiliser CURL, l'extension CURL doit être installée sur votre serveur. Si ce n'est pas le cas, passez au paragraphe suivant.
Le code suivant ouvre une connection avec la passerelle, envoie le(s) message(s) SMS, et récupère l'identifiant(s) de message retourné(s).
<?php // url d'accès à la passerelle $url = "http://www.tm4b.com/client/api/send.php"; // initialisation curl // parametres // au lieu de l'afficher directement // execute la connexion CURL // fermeture de la connexion // affichage de la réponse echo $reponse; ?>
On commence par initialiser une connexion CURL, puis on paramètre quelques options, dont l'option CURLOPT_POST car TM4B impose d'utiliser la méthode POST pour envoyer plusieurs messages. Enfin, on envoie la requête et on ferme la connexion. La réponse est stockée dans la variable $reponse.
Envoyer la requête avec des Sockets
Si la bibliothèque CURL n'est pas disponible sur votre sevreur, vous pouvez utiliser les sockets.
<?php // initialisation des infos $hote = "tm4b.com"; $script = "/client/api/http.php"; $methode = "POST"; // POST pour l'envoi de plusieurs messages if($methode == "GET") { $script .= '?' . $requete; } // initialition de l'entete $entete = $methode . " " . $script . " HTTP/1.1\r\n"; $entete .= "Host: " . $hote . "\r\n"; $entete .= "Content-Type: application/x-www-form-urlencoded\r\n"; $entete .= "Content-Length: " . $longueur_requete . "\r\n"; $entete .= "Connection: close\r\n\r\n"; $entete .= $requete . "\r\n"; // ouverture de la connexion if($socket) // si connexion ok { { } } else { $reponse = false; } // affichage de la réponse ?>
Tout d'abord on paramètre les informations dont on a besoin pour envoyer le SMS, puis on construit l'entête HTTP. Ensuite on établit une connexion à la passerelle en utilisant la fonction fsockopen(). On envoie et récupère les données de la même manière que pour les fichiers en PHP. Une fois le transfert terminé, on ferme le socket avec fclose().
Autres méthodes
Il y a également d'autres méthodes, dont par exemple l'utilisation de la fonction file_get_contents(), mais cette méthode permet uniquement le transfert des paramètres en GET, alors qu'il faut utiliser la méthode POST pour pouvoir envoyer plusieurs messages.
Cette méthode est par contre très simple :
Télécharger le code des exemples précédents
<?php // url d'accès à la passerelle $url = "http://www.tm4b.com/client/api/http.php"; // connexion // affichage de la réponse echo $reponse; ?>
4- Conclusion
Voilà ! Bien qu'il m'a fallu du temps pour trouver & comprendre CURL, je pense que c'est la meilleure méthode si votre configuration de PHP le supporte. CURL et les sockets permettent tous deux d'envoyer des milliers de message en une seule fois (avec POST), mais CURL est plus facile à utiliser, en particulier pour récupérer la réponse.
J'espère que ce tutorial vous sera utile.
Rappel : vous pouvez télécharger le code des exemples précédents.
5- A propos de l'auteur
Ce tutorial a été écrit par Farheen Rehman (et traduit par Damien, après proposition de Farheen).
Farheen Rehman est l'auteur de BestKeptSimple, un blog très populaire à propos des SMS. Elle est consultante dans le domaine des SMS.

Commentaires
1. Le jeudi 2 juin 2005 à 16:06, par Lydia
2. Le jeudi 2 juin 2005 à 17:40, par Damien
3. Le mardi 7 juin 2005 à 17:57, par Marc
4. Le lundi 13 juin 2005 à 17:32, par Tom
5. Le mercredi 17 août 2005 à 14:03, par philippe
6. Le mardi 30 août 2005 à 11:35, par SHiSHioSaMaz
7. Le mardi 30 août 2005 à 12:18, par idem
8. Le lundi 5 septembre 2005 à 12:56, par Benjamin
9. Le mercredi 21 septembre 2005 à 09:28, par kara
10. Le lundi 26 septembre 2005 à 14:11, par Jon
11. Le mercredi 12 octobre 2005 à 14:23, par taybott
12. Le samedi 15 octobre 2005 à 23:08, par didatoto
13. Le jeudi 20 octobre 2005 à 01:31, par Jokris
14. Le mercredi 9 novembre 2005 à 13:13, par Damien
15. Le jeudi 10 novembre 2005 à 11:09, par sktam
16. Le vendredi 18 novembre 2005 à 23:21, par Necris
17. Le mercredi 23 novembre 2005 à 21:39, par Damien
18. Le mardi 29 novembre 2005 à 19:41, par bino
19. Le mardi 6 décembre 2005 à 23:58, par bootec
20. Le jeudi 8 décembre 2005 à 14:47, par mighty
21. Le lundi 26 décembre 2005 à 19:00, par Bapt
22. Le mardi 27 décembre 2005 à 18:58, par Damien
23. Le lundi 16 janvier 2006 à 08:21, par filomat
24. Le mardi 24 janvier 2006 à 16:03, par 4com
25. Le mercredi 25 janvier 2006 à 18:51, par Damien
26. Le jeudi 26 janvier 2006 à 00:31, par 4com
27. Le jeudi 26 janvier 2006 à 21:57, par Damien
28. Le samedi 28 janvier 2006 à 23:55, par 4com
29. Le mercredi 15 février 2006 à 11:20, par bruno
30. Le jeudi 16 février 2006 à 20:36, par 4com
31. Le dimanche 19 février 2006 à 19:09, par Eve
32. Le jeudi 2 mars 2006 à 14:19, par Ju
33. Le mardi 14 mars 2006 à 10:14, par richard bruandet
34. Le vendredi 17 mars 2006 à 12:58, par nacim007
35. Le lundi 10 avril 2006 à 16:18, par Simsoft
36. Le mardi 25 avril 2006 à 12:38, par PoissonSoluble
37. Le mercredi 10 mai 2006 à 10:24, par liou13
38. Le mercredi 17 mai 2006 à 09:23, par guisobar
39. Le vendredi 19 mai 2006 à 13:42, par kefni
40. Le mercredi 24 mai 2006 à 14:22, par steveosteen
41. Le mardi 30 mai 2006 à 10:14, par Denis
42. Le jeudi 1 juin 2006 à 21:58, par Jacque
43. Le lundi 12 juin 2006 à 15:15, par Sniperwolf
44. Le mardi 20 juin 2006 à 10:12, par Michelle
45. Le jeudi 6 juillet 2006 à 13:27, par aymen
46. Le mardi 25 juillet 2006 à 13:44, par otman
47. Le mercredi 9 août 2006 à 23:06, par jup31
48. Le jeudi 17 août 2006 à 11:40, par Dra_Gun
49. Le samedi 26 août 2006 à 15:37, par arthur
50. Le jeudi 31 août 2006 à 17:26, par Smartich
51. Le samedi 9 septembre 2006 à 23:36, par Sniper
52. Le lundi 18 septembre 2006 à 11:23, par dud
53. Le lundi 23 octobre 2006 à 13:08, par SIPro
54. Le samedi 11 novembre 2006 à 13:30, par mostaganem
55. Le mercredi 15 novembre 2006 à 23:09, par Aymen
56. Le mardi 5 décembre 2006 à 01:04, par tungsten
57. Le samedi 3 mars 2007 à 01:56, par alex
58. Le lundi 5 mars 2007 à 06:06, par lethak
59. Le lundi 5 mars 2007 à 06:11, par lethak
60. Le lundi 5 mars 2007 à 07:54, par lethak
61. Le jeudi 8 mars 2007 à 10:57, par jcridolce
62. Le dimanche 11 mars 2007 à 20:33, par Laurent
63. Le jeudi 15 mars 2007 à 18:34, par said
64. Le mardi 27 mars 2007 à 04:03, par Sacapuss
65. Le lundi 2 avril 2007 à 19:13, par generation13
66. Le samedi 7 avril 2007 à 13:00, par romainh41
67. Le dimanche 15 avril 2007 à 11:58, par BOUZIDI
68. Le mercredi 9 mai 2007 à 15:38, par sssssss
69. Le mardi 22 mai 2007 à 12:58, par atoufa
70. Le mardi 19 juin 2007 à 16:18, par kiwis
71. Le lundi 30 juillet 2007 à 15:26, par Janos Audron
72. Le jeudi 23 août 2007 à 18:44, par noreli
73. Le vendredi 24 août 2007 à 13:39, par noreli
74. Le mercredi 3 octobre 2007 à 10:39, par caron
75. Le lundi 15 octobre 2007 à 14:55, par noreli
76. Le jeudi 1 novembre 2007 à 16:23, par alex
77. Le samedi 8 décembre 2007 à 14:29, par manghoum
78. Le lundi 10 décembre 2007 à 17:28, par MArco
79. Le mercredi 12 décembre 2007 à 17:06, par Nico30
80. Le mercredi 12 décembre 2007 à 17:07, par Nico30
81. Le jeudi 13 décembre 2007 à 16:41, par Nico30
82. Le vendredi 15 février 2008 à 16:14, par François
83. Le lundi 25 février 2008 à 12:13, par fred
84. Le vendredi 29 février 2008 à 23:06, par mountaeco
85. Le dimanche 16 mars 2008 à 17:34, par Eucalyptus
86. Le lundi 21 avril 2008 à 12:44, par webbie
87. Le samedi 3 mai 2008 à 20:11, par Ks99
88. Le mardi 6 mai 2008 à 10:35, par nadhem
89. Le jeudi 8 mai 2008 à 11:24, par gogo176
90. Le jeudi 8 mai 2008 à 20:02, par Hugo
91. Le mardi 13 mai 2008 à 00:12, par rogasoft
92. Le jeudi 9 octobre 2008 à 23:51, par RES
93. Le mardi 14 avril 2009 à 12:24, par rock man
94. Le vendredi 29 mai 2009 à 19:59, par gugus
95. Le lundi 27 juillet 2009 à 07:33, par Alberto
96. Le dimanche 27 septembre 2009 à 23:57, par windman
97. Le jeudi 5 novembre 2009 à 15:50, par lazaro
98. Le vendredi 15 janvier 2010 à 04:22, par 007007
99. Le vendredi 9 avril 2010 à 09:21, par Music Search
100. Le jeudi 15 avril 2010 à 00:28, par Mezvangi
101. Le mardi 27 avril 2010 à 10:17, par labatterie
102. Le dimanche 9 mai 2010 à 18:02, par Jeux pour filles
103. Le mercredi 2 juin 2010 à 17:30, par Muhabbet Büyüsü
104. Le dimanche 27 juin 2010 à 14:03, par batterie
105. Le samedi 17 juillet 2010 à 15:30, par s3b
106. Le jeudi 22 juillet 2010 à 14:16, par Rolex watches
107. Le jeudi 22 juillet 2010 à 14:18, par r4 ds
108. Le vendredi 23 juillet 2010 à 15:53, par sunny
109. Le dimanche 8 août 2010 à 10:30, par emmanuel
110. Le jeudi 2 septembre 2010 à 22:21, par envoyer des sms gratuit
111. Le vendredi 3 septembre 2010 à 05:08, par ll
Ajouter un commentaire