« Supervision » SMTP & IMAP

Posté par  . Édité par Ysabeau 🧶 🧦. Modéré par Ysabeau 🧶 🧦. Licence CC By‑SA.
Étiquettes :
28
21
mar.
2022
Supervision

Bonjour,

Prélude

J’ai mis « Supervision » entre guillemets car c’est un peu prétentieux vu l’outil.

Introduction

Il vous est certainement arrivé de constater des indisponibilités ou des lenteurs de votre boite email.

Quand c’est occasionnel on patiente, quand c’est récurrent on contacte le support client de l’hébergeur. Le dialogue avec le support des différents opérateurs/hébergeurs est souvent compliqué sur ce genre de problème de qualité et d’évènements intermittents.

Afin de pouvoir dialoguer avec eux et avoir une vue objective, il faut quantifier et avoir des données fiables. D’où le développement de ce petit outil qui teste les connexions à un ou plusieurs serveurs SMTP/IMAP et génère un historique.

Principe

On interroge le serveur et on journalise le succès et le temps de réponse. Concrètement, cela envoie un e-mail en SMTP à sa propre adresse et ensuite ça l’efface en IMAP. On valide donc le fonctionnement (liaison et authentification) et on mesure les temps pour les deux protocoles.

L’outil se contente de générer les données sous forme d’un historique au format CSV. Chacun pourra ainsi l’exploiter avec un tableur (Libre Office Calc, Excel, OnlyOffice, Calligra Sheets, etc.) pour obtenir ce qui l’intéresse (temps de réponse moyen/max/min) ou taux d’erreur…

Usage

C’est un outil en ligne de commande qui possède un fichier de configuration en JSON.

Selon la configuration, une fois lancé il fonctionne de manière perpétuelle en interrogeant toutes les X minutes. Si on veut que cela fonctionne automatiquement, il faut le déclarer en service sous Linux ou dans une tache planifiée au démarrage de la machine sous Windows.

Les commandes sont les suivantes :

  • -a : ajout d’une boite à lettre à tester
  • -l : liste les boites configurées
  • -d : suppression d’une boite configurée
  • -u : permet de lancer une exécution unique même si la config indique un mode perpétuel.

Configuration

Le fichier JSON est crée automatiquement lors de la première utilisation.

  • AskMin : interrogation toutes les X minutes. Par défaut =0=Interrogation unique
  • CSVName : le nom du fichier de sortie. Par défaut="MailServerMonitor.csv".

Pour chaque boite :

  • eMail : l’e-mail à tester en envoi/réception
  • TimeOutMs : Time out in millisecondes, par défaut =30000
  • ServerName : le nom du serveur ou son IP
  • Login : nom d’utilisateur pour l’authentification
  • EncryptedPassword : utiliser la commande -a pour le créer
  • ImapPort : le port IMAP, par défaut =993
  • ImapSSL : pour utiliser SSL/TLS, par défaut =true
  • SmtpPort : le port SMTP, par défaut =465
  • SmtpSSL : pour utiliser SSL/TLS, par défaut=true

Exploitation

L’historique contient une ligne par test pour chaque serveur configuré.
Le fichier dont le nom est paramétrable contient en entête les noms des colonnes.

On y trouve :

  • le nom/ip du serveur ServerName
  • l'e-mail de la boite eMail
  • la date et heure de l’évènement EventDateTime
  • si l'envoi et la réception on abouti SendRecieveOk
  • si le serveur SMTP fonctionne StmpConnected
  • le temps de réponse du serveur SMTP SmtpResponseTimeMs
  • le message d’erreur associé au SMTP en cas d’erreur SmtpError
  • pareil pour l’IMAP ImapConnected ImapResponseTimeMs ImapError
  • le nombre de messages effacés lors de cette session DeletedCount

MailServeMonitor

C’est son nom et il est OpenSource sur GitHub : MailServerMonitor.

C’est du .Net 6 donc utilisable sous Windows et Linux.

Conclusion

Merci d’avoir lu jusqu’ici.

Si ça peut vous servir le monde de l’Open Source et ma modeste contribution ne seront pas inutiles.

Pour les commentaires, ci-après ou GitHub

Aller plus loin

  • # Commentaire supprimé

    Posté par  . Évalué à 4.

    Ce commentaire a été supprimé par l’équipe de modération.

    • [^] # Re: Comptes SMPT / IMAP différents

      Posté par  . Évalué à 2.

      Juste une question : est-ce qu'il est possible de faire une vérification en envoyant un mail sur une autre boite et en vérifiant l'état de cet autre boite ?

      Pas à ce jour.
      J'y ai pensé mais je me suis contenté de répondre à mon besoin pour l'instant :)

      Au pire, c'est du .Net (merci :smack:) donc je pourrais jeter un oeil et rajouter la fonctionnalité :)

      Avec plaisir.

      • [^] # Commentaire supprimé

        Posté par  . Évalué à 4.

        Ce commentaire a été supprimé par l’équipe de modération.

        • [^] # Re: Comptes SMPT / IMAP différents

          Posté par  . Évalué à 1.

          Je vais créer une discussion sur le GIT cela sera plus approprié.

          Sinon:
          Le X minutes c'est l'attente entre les tentatives, effectivement dérive du temps liée à l'exécution des tests. En pleine connaissance de cause, j'ai laissé comme ça n'ayant pas besoin d'une grande précision.

          Le timeout est configurable dans le config.json

          Pas de réentrance puisque mono thread et séquentiel.

          Pour la boite d’envoi, effectivement bonne remarque, cela doit dépendre de ce qu'il y a au bout.
          Dans mon cas c'est un Exchange, probable qu'il conserve les messages envoyés.
          A vérifier donc.

          Pour la séparation, le plus simple est de séparer la partie serveur et Authentification pour IMAP et SMTP. Comme ça cela permet d'utiliser des boites différentes en croisant.

          Une option serait aussi en cas de panne d’envoyer par un autre serveur une alerte. A voir si cela intéresse du monde.

  • # Pourquoi Yet Another programme ?

    Posté par  (site web personnel, Mastodon) . Évalué à 5.

    Des logiciels libres de supervision, il en existe des millions, et tous peuvent tester IMAP et SMTP (par exemple pour ceux qui ont l'API Nagios, il y a les monitoring plugins https://www.monitoring-plugins.org/doc/man/check_smtp.html et https://www.monitoring-plugins.org/doc/man/check_imap.html).

    • [^] # Re: Pourquoi Yet Another programme ?

      Posté par  . Évalué à 7.

      check_smtp et check_imap, d'après leur description, ne font que s'assurer qu'un socket répond bien (très probablement en vérifiant les premiers échanges du protocole en question). L'outil de Philippe s'assure qu'un mail partant en SMTP est bien reçu en IMAP : la vérification ça plus loin.

      • [^] # Re: Pourquoi Yet Another programme ?

        Posté par  . Évalué à 2.

        Tout à fait.

        Cela dit, ces plugins permettent de spécifier une chaîne à envoyer, et une chaîne à recevoir.

        Il est donc possible (mais plus complexe) en théorie de reproduire le comportement attendu.

        I.e. :
        - envoyer la commande d'envoi de mail depuis le plugin check_smtp, vérifier que la réponse stipule bien qu'il a été envoyé
        - envoyer la commande de réception de mail depuis le plugin check_imap.

        Ca va surtout dépendre de l'outil de supervision, qui doit être capable de s'assurer de la cohérence entre l'envoi et la réception ; là il faudrait un gars avec de l'expérience Nagios / Shinken / … pour répondre.

        On va dire que si c'est pour un particulier ou une PME, la solution présentée ici a de toute façon l'avantage de ne pas demander à devenir un expert supervision juste pour pouvoir mettre le nez de son FAI dans son propre caca.

        • [^] # Re: Pourquoi Yet Another programme ?

          Posté par  (site web personnel) . Évalué à 5.

          C'est jouable de passer des valeurs d'un check à un autre dans nagios/shinken/icinga and co, mais après ça peux te poser des contraintes lors de la scalabilité et c'est pas trivial (pas de magie :p ).

          Donc le principe d'avoir un check qui fait la vérification de toute la chaine est valable, car vérifier juste que SMTP et IMAP répondent n'est pas suffisant dans la vraie vie.

          J'avais un script mode "a l'arrache" dans le passé qui faisait ça, mais clairement en faire un vrai projet a un intérêt :D

          • [^] # Re: Pourquoi Yet Another programme ?

            Posté par  . Évalué à 2. Dernière modification le 22 mars 2022 à 17:11.

            pfiouu.. y a ~20 ans j’étais responsable (entre autre) du monitoring de l'infra email de "Belgacom".

            J'avais donc écrit un "check_smtp" custom qui - en plus de faire un login smtp - envoyait un mail a une adresse de test/custom. email dans lequel je passais quelques metadata custom (en plus d'un body plus ou moins long).. comme le timestamp de création/envoi du email lui même.

            ce qui me permettait dans des check_(imap|pop) tout autant custom .. de faire une lecture des mails recus dans la boite custom.. et de faire un diff avec le timestamp d’arrivée/d’écriture du mail dans la boite. (ce qui permettait de mesure l’efficacité de toute la chaîne infra email)

            KPI quoi ;)

            • [^] # Re: Pourquoi Yet Another programme ?

              Posté par  . Évalué à 2.

              J'ai déjà fait le même genre de choses, mais pas avec check_smtp et check_imap justement.
              Parce que les indicateurs que je voulais c'était "depuis quand il n'y a pas eu d'échange fructueux ?" et "quelle est la durée du roundtrip ?"

              Et c'est beaucoup plus facile à coder from scratch.

    • [^] # Re: Pourquoi Yet Another programme ?

      Posté par  . Évalué à 10.

      https://fr.wikipedia.org/wiki/Principe_KISS

      faire un petit outil simple dédié à la fonction, au besoin
      vs.
      installer un énorme truc comme Nagios, se taper des pages de doc pour y arriver, et ensuite tordre le fonctionnement des testeur de dispo du serveur (check_cmtp, check_imap) pour leur donner une logique stateful permettant de rendre quand même le service dont on avait besoin

    • [^] # Re: Pourquoi Yet Another programme ?

      Posté par  . Évalué à 8.

      Probablement parce que je voulais quelque chose de "simple".
      Utilisable ponctuellement mais aussi pour faire des stats.

      Du souvenir que j'ai de Nagios la courbe d'apprentissage n'est pas compatible avec mon besoin.

      • [^] # Re: Pourquoi Yet Another programme ?

        Posté par  (site web personnel) . Évalué à 5.

        check_smtp et check_imap fonctionnent indépendamment de nagios. Ce sont des petits utilitaires auxquels tu passes les arguments qui conviennent et ils retournent un code d'erreur et quelques métriques. Le lien avec Nagios n'est que dans le format du code d'erreur (ou de succès) et des métriques.

        Sinon pour du debug smtp il y a swaks qui est sympa.

        Adhérer à l'April, ça vous tente ?

        • [^] # Re: Pourquoi Yet Another programme ?

          Posté par  . Évalué à 2.

          C'est pas évident de trouver dans les docs de swaks, check_smtp et check_imap la façon dont on peut vérifier que le mail envoyé en smtp arrive bien jusqu'à la boîte au lettre et peut être lu en imap et le temps que cela prend.

          Ils le font vraiment ?

          Ou tu proposes des outils qui en plus d'être plus complexe ne font pas le travail ?

          • [^] # Re: Pourquoi Yet Another programme ?

            Posté par  (site web personnel) . Évalué à 2.

            Ou tu proposes des outils qui en plus d'être plus complexe ne font pas le travail ?

            Sympa l'accueil. :)

            Alors d'une part je ne recommande pas spécialement, je précise des éléments pour expliquer que s'attaquer à la complexité check_smtp ne ressemble en aucune mesure à la complexité de s'attaquer à Nagios.

            D'autre part swaks est très bien documenté.

            $ man swaks | wc
               1024   10590   77508
            

            Adhérer à l'April, ça vous tente ?

            • [^] # Re: Pourquoi Yet Another programme ?

              Posté par  . Évalué à 3.

              je pense que t'as pas compris que l'outil de Philippe permet de corréler le message envoyé et le message reçu, ni l'ironie de mon propos sur la doc de swaks, je vais quand même essayer de te le redire de façon imagée mais c'est pas gagné:

              $ man swaks|grep -i imap
              $

  • # Convention

    Posté par  . Évalué à 3.

    • eMail : l’e-mail à tester en envoi/réception
    • TimeOutMs : Time out in millisecondes, par défaut =30000
    • ServerName : le nom du serveur ou son IP
    • Login : nom d’utilisateur pour l’authentification
    • EncryptedPassword : utiliser la commande -a pour le créer
    • ImapPort : le port IMAP, par défaut =993
    • ImapSSL : pour utiliser SSL/TLS, par défaut =true
    • SmtpPort : le port SMTP, par défaut =465
    • SmtpSSL : pour utiliser SSL/TLS, par défaut=true

    Je comprends qu'utiliser EMail t'a gêné mais je trouve du coup le nommage moins cohérent. Est-ce que Target, Recipient ou Mail n'aurait pas était mieux ?

    Sinon l'IETF n'utilise jamais cette convention, mais bien email/Email (par exemple dans le RFC5321).

    https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

  • # V1.1

    Posté par  . Évalué à 2.

    La version 1.1 est publiée :

    • Add random key for securing password
    • server separation for SMP & IMAP
    • elimination of time drift
    • catch exception if export failed
    • change CSV format
    • change config file

    https://github.com/GPh83/MailServerMonitor/releases

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.