Sommaire
- Le besoin de départ
- Un projet pensé aussi dans un esprit d’entraide CHATONS
- À quoi ressemble l’architecture
- À qui ça s’adresse ?
- Fonctionnalités principales
- Ce que la version 1.0 apporte
- Démo, code source, documentation
- Quelques remarques sur l’état du projet
Bonjour,
Je profite de la sortie de la version 1.0 de oMailgw pour présenter le projet ici, car je n’en avais encore jamais vraiment moulé sur LinuxFr.
oMailgw est un logiciel libre que je développe pour répondre à un besoin très concret : gérer, superviser et partager une ou plusieurs passerelles e-mail sortantes basées sur Postfix.
En pratique, c’est l’outil que j’utilise derrière mon offre de passerelle e-mail / relai SMTP : https://retzo.net/services/hebergement/passerelle-e-mail-relai-smtp/
L’idée est de proposer une brique libre et auto-hébergeable pour celles et ceux qui veulent :
- garder la main sur leur trafic sortant ;
- mutualiser une ou plusieurs passerelles ;
- donner de l’autonomie aux utilisateurs sur la lecture de leurs erreurs ;
- et mieux suivre la réputation / délivrabilité sans devoir tout relire à la main dans les logs. (c'est chouette grep mais quand il faut suivre les rebonds sur plusieurs serveurs ça fait beaucoup de grep… et trop de grep tue le grep)
Le besoin de départ
Quand on exploite une passerelle sortante Postfix, on a vite les mêmes problèmes :
- certains messages sont refusés ;
- d’autres sont différés ;
- des destinataires n’existent plus ;
- certaines plateformes acceptent puis classent mal ;
- on peut se retrouver blacklisté à force d’insister vers de mauvaises cibles ;
- et, côté utilisateurs, la compréhension de ce qui se passe est souvent très limitée.
Sur un petit service mutualisé, ça pose un problème classique : l’administrateur a les logs, mais l’utilisateur ne sait pas forcément pourquoi son trafic passe mal. À l’inverse, laisser tout le monde fouiller dans les logs du serveur n’est évidemment pas une solution.
oMailgw a été pensé pour faire le lien entre ces deux mondes :
donner une vision d’exploitation aux administrateurs, tout en ouvrant une partie de cette visibilité aux utilisateurs, avec des permissions adaptées.
Un projet pensé aussi dans un esprit d’entraide CHATONS
Le projet a aussi été imaginé avec une logique d’entraide entre petites structures, notamment dans un contexte proche de celui des CHATONS.
L’idée de fond est simple : plusieurs petites structures peuvent avoir intérêt à mutualiser du savoir-faire, du monitoring, voire une partie de leur infrastructure de sortie e-mail, tout en gardant chacune leur autonomie.
Dans ce type de scénario, oMailgw permet par exemple :
- de superviser plusieurs passerelles sortantes ;
- de suivre les erreurs par serveur, par domaine, par utilisateur ou par authentification SMTP ;
- de donner à chaque structure ou client une vue limitée à ce qui la concerne ;
- et, en cas de souci de réputation sur une IP, de mieux comprendre ce qui se passe avant de décider d’un basculement ou d’un rééquilibrage du trafic.

À quoi ressemble l’architecture
Le projet est découpé en trois briques principales :
- oMailgw API : le cœur applicatif, développé en PHP avec Laravel, avec stockage des données côté base SQL ;
- oMailgw UI : une interface web en HTML/JS, qui consomme l’API ;
- oMailgw CLI : un client installé sur une ou plusieurs passerelles utilisant Postfix, chargé de lire les logs et de remonter les informations à l’API via HTTP.
À qui ça s’adresse ?
Je vois plusieurs cas d’usage assez nets.
1. Le petit hébergeur / admin sys qui opère une ou plusieurs passerelles
Cas typique : on a un ou plusieurs Postfix sortants, on veut suivre les erreurs, la file d’attente, les comptes SMTP auth, les messages refusés, les domaines problématiques, et éviter de naviguer uniquement dans les logs système.
2. Le prestataire qui fournit un service de relai SMTP à ses clients
C’est le cas que j’ai chez Retzo : proposer un service de relai SMTP simple à intégrer, avec interface/API de suivi, et laisser les clients consulter leurs propres envois, erreurs et rapports.
3. Un collectif ou une fédération de petites structures
Dans un esprit proche des CHATONS, plusieurs structures peuvent vouloir partager des outils, de la supervision, voire des passerelles de sortie, tout en cloisonnant les accès.
Fonctionnalités principales
Aujourd’hui, oMailgw permet notamment :
- la consultation des logs de trafic e-mail sortant ;
- la recherche et le filtrage dans les logs ;
- la consultation du détail d’un message ;
- la visualisation des e-mails encore en file d’attente ;
- des permissions fines selon plusieurs critères, par exemple :
- expéditeur complet ;
- domaine expéditeur ;
- authentification SMTP ;
- serveur source ;
- la gestion des authentifications SMTP ;
- la gestion de
transport_map(permet de rediriger une partie du trafic vers l'une ou l'autre des passerelles selon sa réputation) ; - la gestion de blacklists manuelles ;
- des mécanismes d’auto-blacklist (FBL, User Unknown revenu au moins 3 fois…) ;
- des rapports périodiques par e-mail ;
- des statistiques sur le trafic et les erreurs ;
- l’export CSV des logs ;
- une interface différenciée selon les rôles (
root,admin,user,mailgw).
L’un des points auxquels je tenais était l’autonomie utilisateur :
un utilisateur qui envoie réellement via la passerelle peut se créer un compte et consulter uniquement ce qui le concerne, au lieu de dépendre d’une lecture manuelle côté admin.



Ce que la version 1.0 apporte
La 0.9 posait déjà bien les bases, mais la 1.0 marque un cap plus net côté exploitation.
Qualification des bounces
Le gros travail a porté sur la manière de qualifier les erreurs.
Au lieu d’avoir seulement des messages SMTP bruts parfois difficiles à exploiter, la 1.0 introduit une qualification plus homogène :
successsofthardunknown
et ajoute des raisons normalisées exploitables côté API, statistiques, dashboard et rapports.
L’objectif est simple : mieux distinguer, par exemple :
- une erreur temporaire ;
- une boîte inexistante ;
- un rejet pour suspicion de spam ;
- un refus lié à la réputation ;
- ou un cas plus ambigu qui demande une analyse.
Intégration des FBL
Autre point important : la prise en charge des Feedback Loops (FBL), donc des plaintes remontées quand un destinataire marque un message comme abusif / indésirable.
Dans oMailgw 1.0, ces plaintes peuvent être récupérées via IMAP, intégrées à l’outil, puis relayées par notification aux administrateurs autorisés.
Pour moi, c’est un vrai progrès : on ne regarde plus seulement les messages non délivrés, on commence aussi à voir plus clairement les messages mal reçus.
Rapports plus lisibles
Les rapports périodiques ont été revus :
- rendu HTML plus propre ;
- seuils visuels pour repérer plus vite les zones problématiques ;
- ajout de rapports autour des blacklists et du spool ;
- personnalisation par utilisateur.
Chaque utilisateur peut désormais mieux définir ce qu’il considère comme une erreur dans ses rapports, avec notamment la possibilité d’inclure ou non les soft bounces dans les statistiques.
Interface plus orientée exploitation
La 1.0 apporte aussi :
- une administration des utilisateurs réellement finalisée côté
root-panel; - un dashboard plus modulaire ;
- des raisons de bounce visibles dans davantage de vues ;
- l’export CSV ;
- une meilleure cohérence entre front et back sur les libellés et le calcul des taux d’erreur.
Démo, code source, documentation
Démo :
Forge / code source :
- https://framagit.org/omailgw
- https://framagit.org/omailgw/omailgw
- https://framagit.org/omailgw/omailgw-api
- https://framagit.org/omailgw/omailgw-cli
Plus d'image :
Service utilisant oMailgw :
Annonce de la version 1.0 :
Quelques remarques sur l’état du projet
Le projet m’est d’abord utile à moi, dans un contexte réel d’exploitation.
C’est sans doute aussi ce qui lui donne sa forme actuelle : il ne cherche pas à couvrir tout le champ de l’e-mail, mais à répondre à des besoins concrets de supervision de passerelles sortantes.
La 1.0 ne veut pas dire “projet terminé”, mais plutôt : le socle est là, les usages réels aussi, et l’outil commence à devenir suffisamment cohérent pour être présenté plus largement.
Merci pour votre lecture !

# Excellent…
Posté par Emeric . Évalué à 1 (+0/-0).
Effectivement, la délivrabilité avec un serveur perso, c'est un peu une prise de tête permanente…
Il va falloir que je teste ça :)
[^] # Re: Excellent…
Posté par David (site web personnel, Mastodon) . Évalué à 3 (+2/-0).
c'est pas magique hein… Même avec ça c'est toujours prise de tête :-p les problèmes restent les mêmes, tu les vois facilement :-)
[^] # Re: Excellent…
Posté par Emeric . Évalué à 2 (+1/-0).
on est bien d'accord…
ça reste un duel de David contre Goliath en continu, mais ce genre d'outil apporte tout de même une note positive…
# Site down ?
Posté par Calaad . Évalué à 0 (+0/-0).
Ton site a l'air down.
J'irai jeter un œil à la démo quand ça sera up. Ce genre de service peut être super utile !
# Trop bien
Posté par IceCat (Mastodon) . Évalué à 6 (+5/-0).
J'ai géré pas mal postfix dans ma carrière, et j'aurais bien aimé pouvoir disposer d'un tel outil ! Ça manquait vraiment !
Merci pour ton travail, je l'utiliserai bientôt sans aucun doute.
[^] # Re: Trop bien
Posté par Framasky (site web personnel) . Évalué à 3 (+1/-0).
Ouais, tout pareil : merci !
Dès que j'aurais le temps, je testerais 🙂
Being a sysadmin is easy. As easy as riding a bicycle. Except the bicycle is on fire, you’re on fire and you’re in Hell.
[^] # Re: Trop bien
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 2 (+0/-0).
Pareil, j’aurais bien aimé avoir cet outil plus tôt mais il n’arrive pas trop tard.
“It is seldom that liberty of any kind is lost all at once.” ― David Hume
[^] # Re: Trop bien
Posté par jp.louvel . Évalué à 2 (+1/-0).
Merci pour la présentation, le projet a l'air vraiment chouette.
Juste pour confirmer ma compréhension de l'architecture : omailgw-cli, c'est bien un agent qui tourne sur le serveur Postfix, qui lit les logs mail et interroge la file d'attente, puis pousse ces informations vers omailgw-api via HTTP ? Et le flux est bien unidirectionnel (cli vers api), l'API ne peut pas envoyer de commandes en retour vers le serveur mail ?
D'un point de vue sécurité, c'est un point important pour moi, un agent qui ne fait qu'émettre sans jamais recevoir d'instructions depuis l'extérieur.
[^] # Re: Trop bien
Posté par David (site web personnel, Mastodon) . Évalué à 3 (+2/-0).
C'est ça.
L'API ne peut pas interroger le CLI. C'est toujours le CLI qui envoie des infos à l'API.
Ceci étant dit, quand le CLI initie une demande à l'API d'envoi de log, préalablement, elle peut recevoir (si tu l'as paramétré, si tu le souhaites… Tu peux ne pas le faire) :
* Les "transports maps" : chemin / route ajouté dans l'interface par l'utilisateur "root" pour rediriger du trafic vers certains domaines (exemple, ma mailgw1 est bloqué vers hotmail, je bascule tout le trafic hotmail vers mailgw2…)
* Les authentifications SMTP créé par les utilisateurs admin. (permette l'authentification sur les passerelles)
Encore une fois, tu peux ne pas utiliser ces fonctionnalités, ça se configure dans le config.php
# Intéressant !
Posté par Pat _ . Évalué à 2 (+1/-0).
Après pas mal de tâtonnements, j'ai réussi à faire le faire tourner en mode sens unique remontée des logs (je n'ai pas besoin des blacklists et transport map, et je n'ai pas très envie de péter mes serveurs en jouant avec l'authentification).
C'est cool, j'aurai un ou deux soucis à signaler quand j'aurai un peu de temps.
[^] # Re: Intéressant !
Posté par Pat _ . Évalué à 1 (+0/-0).
(suite…)
Pour moi le plus délicat a été le paramétrage de Apache pour l'API et l'UI. Finalement c'est simple une fois qu'on sait !
Les 2 soucis que j'ai :
1- pas trouvé comment déclarer des serveurs autrement que par appel à l'API en ligne de commande, si ça existe dans l'UI, c'est bien planqué
2- l'API plante sur certaines lignes de log, du coup l'envoi complet par le client s'arrête ; j'ai dû bricoler un peu le code pour passer outre…
Une fois tout ça tombé en marche, c'est cool
! MERCI !
Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.