Gmail : Planifier la suppression automatique de vos emails après X jours

| 4 minutes, 12 secondes

MAJ du 18/12/2018 : A la demande d'Adrien dans un commentaire, j'ai ajouté une fonction qui permet de supprimer automatiquement les messages lus de la boite de réception après un délai choisi.

L'une des clés du succès de Gmail auprès du grand public (le service de messagerie de Google comptait 900 millions d'utilisateurs au troisième trimestre 2016) est son interface simple et intuitive. Mais cette qualité peut vite s'avérer être un vilain défaut pour les usages les plus avancés, comme il sont nombreux en entreprise. Heureusement, Google a pensé à tous ces clients (y compris les professionnels auxquels elle réserve la G Suite) et offre la possibilité aux plus aguéris de manipuler — presque — sans limites leurs données stockées sur les plateformes du Google Cloud...

J'ai l'habitude de configurer le tri automatique de certains emails (rapports automatiques quotidiens) dans des libellés. Ces rapports ne me sont utiles qu'en cas de problème, et je ne souhaite pas qu'ils encombrent ma boite. J'ai donc besoin qu'ils soient supprimés automatiquement 7 jours après réception. Via l'interface Gmail, aucun problème pour trier (les filtres sont là pour celà), il est par contre impossible de programmer la suppression après X jours.

Il existe pourtant bien une solution : Google script est un language executé sur les serveurs de Google et très fortement inspiré de JavaScript. Connectez-vous au site https://script.google.com avec votre compte Gmail pour afficher l'IDE Google Script :

Cette interface est un editeur de projet GS (Google Script) qui enregistre les modifications sur votre espace Google Drive. Dans ce projet (que vous pouvez renommer à votre guise), nous allons créer deux fichiers (Le premier comportera les fonctions et le second les appellera) :

  • functions.gs
  • main.gs

Dans le fichier functions.gs, collez le code suivant :

/**
 * Arguments :
 *     label : libellé (string)
 *     delay : délai en jours (int),
 * Retour    :
 *     n     : Nb d'élém mis à la corbeille (int)
 *
 * Met les discussions (max 500) portant le
 * libellé label et vieilles de plus de
 * delay jours à la corbeille.
 */
function partialPurgeLabel(label, delay) {
    var maxDate = new Date(); 
    maxDate.setDate(maxDate.getDate()-delay);
    var label = GmailApp.getUserLabelByName(label);
    var threads = label.getThreads();
    var n = 0
    for (var i = 0; i < threads.length; i++) { 
        if (threads[i].getLastMessageDate() < maxDate){
          threads[i].removeLabel(label);
          threads[i].moveToTrash();
          n++;
        } 
    }
    return n;
}

/**
 * Arguments :
 *     label : libellé (string)
 *     delay : délai en jours (int),
 * Retour    :
 *     n     : Nb d'élém mis à la corbeille (int)
 *
 * Met toutes les discussions portant le
 * libellé label et vieille de plus de delay
 * jours à la corbeille.
 */
function purgeLabel(label, delay){
    var cnt = partialPurgeLabel(label,delay);
    var tmp = cnt;
    while(tmp>0){
        tmp = partialPurgeLabel(label,delay)
        cnt+=tmp;
    }
  return cnt;
}

/**
 * Arguments :
 *     label : libellé (string)
 * Retour    :
 *     uLabels : sous-libellés de libellé (label[])
 */
function children(label) { 
    var uLabels = GmailApp.getUserLabels();
    uLabels = uLabels.filter(function(s){return s.getName().match(label+'/');})
    return uLabels.map(function(e){return e.getName();})
}

/**
 * Arguments :
 *     label : libellé (string)
 *     delay : délai en jours (int),
 * Retour    :
 *     n     : Nb d'élém mis à la corbeille (int)
 *
 *     Met toutes les discussions du
 *     libellé label ET SES SOUS-LABELS,
 *     vieille de plus de delay jours à
 *     la corbeille.
 */
function purgeNestedLabels(label, delay){
    var labels = children(label);
    var n = 0;
    for (var j = 0; j < labels.length; j++) {
        n += purgeLabel(labels[j], delay);
    }
    return n;
}

/**
 *
 * Arguments :
 *     delay :  délai en jours (int),
 * Retour    :
 *     n     : Nb d'élém mis à la corbeille (int)
 *
 * Met les éléments (max 500) de Inbox lus vieux de  
 * plus de delay jours et ne portant aucun libellé à la corbeille.
 *
 */
function partialPurgeInbox(delay){
  var maxDate = new Date(); 
  maxDate.setDate(maxDate.getDate()-delay);
  var sDate = Utilities.formatDate(maxDate, "GMT", "yyyy/MM/dd");
  var toDel = GmailApp.search("has:nouserlabels -in:Sent -in:Chat -in:Draft in:Inbox is:read before:"+sDate);
  var n = 0;
  for (var i = 0; i < toDel.length; i++) { 
    toDel[i].moveToTrash();
    n++;
  }
  return n;
}

/**
 *
 * Arguments :
 *     delay :  délai en jours (int),
 * Retour    :
 *     n     : Nb d'élém mis à la corbeille (int)
 *
 * Met tous les éléments de la boite de reception vieux de 
 * plus de delay jours à la corbeille.
 *
 */
function purgeInbox(delay){
  var cnt = partialPurgeInbox(delay);
  var tmp = cnt;
  while(tmp>0){
    tmp = partialPurgeInbox(delay)
    cnt+=tmp;
  }
  return cnt;
}

Pour ceux qui maitrisent la programmation, ce code est très simple. Pour les autres, les commentaire qui précèdent chaque fonction vous indiqueront leur utilité. Retenez simplement que les deux fonctions utiles sont purgeLabel(label, delay) et purgeNestedLabels(label, delay) qui mettent à la corbeille les discussions vieilles de plus de delay jours dans le libellé label pour la première, et dans le libellé label ainsi que tous ses sous-libellés pour la seconde.

Une fois le fichier functions.gs enregistré, éditez main.gs pour y ajouter autant d'appels aux deux fonctions citées ci-dessus que nécessaire. Par exemple :

function main(){
    //Purge des mails >7j du libellé Rapports
    purgeLabel("Rapports",7);
    //Purge des mails >14j du libellé Alertes et ses sous-libellés
    purgeNestedLabels("Alertes",14);
    //Purge des éléments de la boite de réception lus, sans libellé et vieux de plus de 30 jours
    purgeInbox(30);
}

Il vous reste à programmer l'execution de la fonction main() tous les jours à l'heure de votre choix. Pour cela, cliquez sur Ressources > Déclencheurs du projet actuel et demandez l'execution de main() en fonction du temps avec un compteur de jours et le créneau horaire de votre choix :

Synchroniser l'heure de votre Ra… Privacité différentielle : Comme…

Commentaires