Envoyer un SMS depuis Gmail via Freemobile

Il y a une option sur FreeMobile qui permet de recevoir des sms gratuitement sur votre ligne freemobile en appelant une simple URL.

Pour mes besoins, j'ai modifié un petit script Google trouvé sur le web qui vous permettra de faire la liaison entre Gmail et ce service. Autrement dit, à chaque fois que vous recevrez un mail correspondant à un libellé précis, vous recevrez automatiquement un SMS sur votre mobile.

Mais pourquoi ?

Pourquoi s’embêter à recevoir des alertes par sms alors qu'on peut les recevoir direct par mail ?

-vous n'avez pas de forfait internet (forfait 2€ de Free)
-vous n'avez pas de "smartphone" (téléphone de boulot, téléphone de secours, ...)
-domotique via SMS
-etc ...

Comment activer votre service de notifications SMS ?

image-2-300x265

Le principe est simple, activez l'option gratuite dans votre espace abonné, rendez-vous dans vos options et activez les "Notifications par SMS". Vous obtiendrez alors une clé d'identification au service, notez là dans un coin car elle est nécessaire au bon fonctionnement de l'envoi.

Comment ça marche ?

Voici le fonctionnement de base (explications venant de freemobile)

L'envoi du SMS se fait en appelant le lien suivant : https://smsapi.free-mobile.fr/sendmsg
avec les paramètres suivants :

    user :  votre login
    pass :  votre clé d'identification générée automatiquement par notre service
    msg :  le contenu du SMS encodé sous forme d'url (Percent-encoding)

Exemple : Envoyer le message "Hello World !" sur votre mobile :

https://smsapi.free-mobile.fr/sendmsg?user=18579358&pass=wUxxnu1DdRMF9k&msg=Hello%20World%20!

Vous pouvez également, si vous le préférez, envoyer les paramètres en POST.
Dans ce cas, le contenu du message n'a pas besoin d'être encodé.

Le code de retour HTTP indique le succès ou non de l'opération :

    200 : Le SMS a été envoyé sur votre mobile.
    400 : Un des paramètres obligatoires est manquant.
    402 : Trop de SMS ont été envoyés en trop peu de temps.
    403 : Le service n'est pas activé sur l'espace abonné, ou login / clé incorrect.
    500 : Erreur côté serveur. Veuillez réessayer ultérieurement.

Recevoir un SMS pour chaque nouveau mail correspondant à un libellé précis

Voici le script, je vous donne les détails et la mise en place après.



//############################################################//
//                                                            //
//   Freemobile AutoSMS via Gmail Label (V1.2)                //
//                                                            //
//   Script by CHAUVIN Julien for webinventif.com             //
//   Set by OLLIVIER Anthony                                  //
//   Docs: https://developers.google.com/apps-script/         //
//                                                            //
//############################################################//

// -----------------------------------------------------
// Globals
// -----------------------------------------------------
LABEL_SMS = 'SMS Perso';
LABEL_SMS_LU = 'SMS Perso lu';
FREE_PASS = 'votre_clé_de_notification';
FREE_USER = 'votre_identifiant_freemobile';
THREAD_SINGLE_ALERT = true;//recevoir une seule alerte par "conversation" ou à chaque nouveau mail (même dans la même conversation)
SMSMAX = 5; //nombre de SMS maximum par message
LIMIT = 4; //limite de messages à traiter par le programme par minute

//THREAD_SINGLE_ALERT permet de choisir si l'on reçoit une notification SMS à chaque nouveau message d'une conversation (mails empilés)
//ou juste lors du 1er message de la pile. En mettant THREAD_SINGLE_ALERT sur true, vous recevrez donc un sms a chaque nouveau mail
//qui s'ajoute à la conversation (avec le contenu du dernier message de la pile)


// -----------------------------------------------------
// ReturnFreeUrl(message)
// Retourne l'url du service SMS remplie et formatée
// -----------------------------------------------------

function ReturnFreeUrl(message,j) {
    message = message.replace(/(\r\n|\n|\r)/gm," ");//les sauts de lignes ne passent pas en GET, alors on nettoie
    return "https://smsapi.free-mobile.fr/sendmsg?user="+FREE_USER+"&pass="+FREE_PASS+"&msg="+encodeURIComponent(message.substring(480*j,480*(j+1)));
}


// -----------------------------------------------------
// EnvoiSMS()
// Envoi un SMS pour chaque message non lu correspondant
// au label défini dans LABEL_SMS et réattribue le label
// LABEL_SMS_LU
// -----------------------------------------------------
function EnvoiSMS() {
    var label = GmailApp.getUserLabelByName(LABEL_SMS); //retourne le label en donnant son nom
    var compt = label.getUnreadCount(); //retourne le nombre de fils non lus avec le label correspondant
    var singleAlert = 1;
  if (compt != 0){ //si il y a au moins 1 fil non-lu dans le label correspondant :
        var labelLu = GmailApp.getUserLabelByName(LABEL_SMS_LU);
        var threads = label.getThreads(); //retourne un tableau des fils correspondants au label
        var maxMails = LIMIT;
        if(!maxMails) maxMails = threads.length; //Si LIMIT = 0, alors il y a aucune limite -le nombre de fils-, sinon on garde la limite fixée.
        var min = Math.min(maxMails,threads.length);
        for (i = 0; i < min; i++){
            if(THREAD_SINGLE_ALERT) singleAlert = threads[i].getMessageCount(); //retourne le nombre de message dans le fil numero i
            if(threads[i].isUnread()){
                var mailBody = threads[i].getMessages()[Number(singleAlert-1)];// obtenir le dernier message du fil
                var mailTitle = mailBody.getSubject();
                var expediteur = mailBody.getFrom();
                var message = mailTitle+' | '+mailBody.getPlainBody();
                if(expediteur != 'atinyolli@gmail.com') message = expediteur + ' | ' + message ;
                quo = Math.min(SMSMAX,1+Math.floor((message.length - 1)/480)); //nbr de SMS a envoyer en fonction de la taille du message
                for (j = 0; j < quo; j++){
                  var mailUrl = ReturnFreeUrl(message,j); //prepare l'URL pour envoi
                  var response = UrlFetchApp.fetch(mailUrl); //fait un requete pour lancer l'url
                }
                threads[i].addLabel(labelLu); //donne au fil un autre label
                threads[i].removeLabel(label); //enleve au fil le label precedent
            }
        }
    }
}


Donc en gros ce script sera exécuté chaque minute (ou plus, voir la suite), il va chercher tous les mails non lu ayant le libellé défini dans LABEL_SMS, les envoie par SMS et change le label par celui défini dans LABEL_SMS_LU (pour éviter qu'ils ne soient envoyés à appel du script). Donc indiquez vos libellés et vos identifiants dans la section "Globals" du script.

N'oubliez pas de remplacer dans le script votre_clé_de_notification et votre_identifiant_freemobile par vos vrais identifiants se trouvant sur votre espace Free Mobile

Ok mais je fais comment pour activer ce script ?

Ce script est un "Google Apps Script", et pour qu'il soit pris en compte, il va falloir l'ajouter dans votre Google drive de la manière suivante:

  1. Créez ou ouvrez une feuille de calcul dans votre drive

  2. Allez dans le menu "Extensions" puis "Apps script"
  3. Choisissez "Projet vide" et collez le script dans la nouvelle fenêtre
  4. Enregistrez le script et ajoutez un déclencheur (bouton en bas à droite) représenté par le reveil
  5. Dans le nouveau déclencheur, choisissez d’exécuter la fonction "EnvoiSMS" dans le menu déroulant,
    puis dans les autre menu déroulant choisir : "Déclencheur horaire", "Intervalle en minutes", "Toutes les minutes"
    Et "enregistrer"

  6. Une alerte d’autorisation va apparaitre, cliquez sur "Continuer"
  7. Dans la nouvelle fenêtre, cliquez sur "J'accepte"
  8. C'est enfin fini !