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 :

  1. <?php
  2.  
  3. // initialisation des variables
  4. $requete = '';
  5. $param['username'] = 'mon_identifiant'; // identifiant de notre compte TM4B
  6. $param['password'] = 'mon_motdepasse'; // mot de passe de notre compte TM4B
  7. $param['type'] = 'broadcast'; // envoi de sms
  8. $param['msg'] = 'Ceci est un message de test.'; // message que l'on désire envoyer
  9. $param['to'] = '33612345678|336'; // numéros de téléphones auxquels on envoie le message
  10. $param['from'] = 'MonSite'; // expéditeur du message (first class uniquement)
  11. $param['route'] = 'business'; // type de route (pour la france, business class uniquement)
  12. $param['sim'] = 'yes'; // on active le mode simulation, pour tester notre script
  13. // construction de la requete
  14. foreach($param as $clef => $valeur) // pour chaque champ
  15. {
  16. $requete .= $clef . '=' . urlencode($valeur); // il faut bien formater les valeurs
  17. $requete .= '&';
  18. }
  19.  
  20. ?>

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).

  1. <?php
  2.  
  3. // url d'accès à la passerelle
  4. $url = "http://www.tm4b.com/client/api/send.php";
  5. // initialisation curl
  6. $ch = curl_init();
  7. // parametres
  8. curl_setopt($ch, CURLOPT_URL, $url); // url
  9. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // retourne une variable
  10. // au lieu de l'afficher directement
  11. curl_setopt($ch, CURLOPT_POST, 1); // active la méthode POST
  12. curl_setopt($ch, CURLOPT_POSTFIELDS, $requete); // requete
  13. // execute la connexion CURL
  14. $reponse = curl_exec($ch);
  15. // fermeture de la connexion
  16. // affichage de la réponse
  17. echo $reponse;
  18.  
  19. ?>

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.

  1. <?php
  2.  
  3. // initialisation des infos
  4. $hote = "tm4b.com";
  5. $script = "/client/api/http.php";
  6. $longueur_requete = strlen($requete);
  7. $methode = "POST"; // POST pour l'envoi de plusieurs messages
  8. if($methode == "GET")
  9. {
  10. $script .= '?' . $requete;
  11. }
  12. // initialition de l'entete
  13. $entete = $methode . " " . $script . " HTTP/1.1\r\n";
  14. $entete .= "Host: " . $hote . "\r\n";
  15. $entete .= "Content-Type: application/x-www-form-urlencoded\r\n";
  16. $entete .= "Content-Length: " . $longueur_requete . "\r\n";
  17. $entete .= "Connection: close\r\n\r\n";
  18. $entete .= $requete . "\r\n";
  19. // ouverture de la connexion
  20. $socket = fsockopen($hote, 80, $errno, $errstr);
  21. if($socket) // si connexion ok
  22. {
  23. fputs($socket, $entete); // envoi de l'entete
  24. while(!feof($socket))
  25. {
  26. $reponse[] = fgets($socket); // recupere les resultats
  27. }
  28. fclose($socket);
  29. }
  30. else
  31. {
  32. $reponse = false;
  33. }
  34. // affichage de la réponse
  35. print_r($reponse);
  36.  
  37. ?>

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 :

  1. <?php
  2.  
  3. // url d'accès à la passerelle
  4. $url = "http://www.tm4b.com/client/api/http.php";
  5. // connexion
  6. $reponse = file_get_contents($url . '?' . $requete);
  7. // affichage de la réponse
  8. echo $reponse;
  9.  
  10. ?>
Télécharger le code des exemples précédents

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.