Comment acheminer les e-mails entrants vers votre application avec Exim

0
158
dwori/Shutterstock.com

Exim est un agent de transfert de messages (MTA) populaire pour les systèmes Unix. Il offre une grande variété d'options de routage et de transport. Dans cet article, nous montrerons comment utiliser Exim pour rediriger les e-mails entrants dans votre propre script.

Nous supposerons que vous disposez déjà d'un serveur Exim qui fonctionne ;s capable de recevoir des e-mails. Le wiki officiel fournit des conseils informatifs si vous repartez de zéro avec une nouvelle installation.

Gestion de la configuration Exim

Les approches de configuration disponibles varient selon la distribution du système d'exploitation. Une installation Exim construite à partir des sources utilisera src/configure.default comme fichier de configuration.

Le fichier pour Exim installé à partir d'un gestionnaire de paquets est généralement /etc/exim/config ou /etc/exim.conf. Vous pouvez trouver le chemin actuellement utilisé en exécutant exim -bP configure_file.

Les systèmes d'exploitation basés sur Debian ont un système légèrement plus compliqué. Il existe deux méthodes de configuration possibles : un seul fichier, /etc/exim4/exim4.conf.template, ou des fichiers de configuration divisés dans /etc/exim4/conf.d. Vous devez exécuter update-exim4.conf après avoir apporté des modifications. Cela crée un seul fichier fusionné qui est réellement lu par Exim.

Publicité

Exim doit être redémarré chaque fois que vous modifiez sa configuration. Exécutez le redémarrage du service exim4 pour appliquer vos modifications.

Création d'un routeur

La première étape pour envoyer un e-mail à votre application consiste à définir un routeur personnalisé. Les routeurs comparent les e-mails entrants à un ensemble de conditions pour déterminer le mécanisme de livraison à utiliser.

Les routeurs sont traités dans l'ordre séquentiel dans lequel ils se trouvent dans le fichier de configuration. Tous les routeurs situés au-dessus du vôtre dans le fichier peuvent d'abord correspondre aux e-mails entrants.

Ajoutez votre routeur à votre fichier de configuration dans la section CONFIGURATION DES ROUTEURS. Si vous utilisez la configuration Debian fractionnée, vous pouvez à la place créer un nouveau fichier dans /etc/exim4/conf.d/routers. Les routeurs seront combinés par ordre alphabétique lorsque vous utilisez cette approche.

Voici un exemple de routeur :

example_router : driver = accept domains = example.com transport = example_transport

Ceci est un routeur de base qui correspond à tout e-mail envoyé à example.com. Lorsqu'une correspondance est traitée, Exim accepte le message et le livre à l'aide du transport example_transport. Nous allons le créer ensuite.

Créer un transport

Une fois qu'un e-mail a été accepté par un routeur, il est livré par un transporteur. Les transports sont responsables de la mise en œuvre de la routine de livraison des messages. Différents pilotes peuvent envoyer sur Internet à l'aide de SMTP, transférer à un utilisateur Unix local ou écrire dans un fichier.

Publicité

Créer un transport personnalisé basé sur un pilote intégré vous permet de fournir des e-mails correspondants à votre propre candidature. Vous pouvez ensuite traiter chaque e-mail individuellement, en dehors d'Exim.

Contrairement aux routeurs, l'ordre des transports n'a pas d'importance. Chaque e-mail entrant correspondra au transport unique spécifié par le routeur qui l'accepte. Ajoutez votre transport n'importe où dans la section CONFIGURATION DES TRANSPORTS de votre fichier Exim. Les utilisateurs de Debian avec la configuration fractionnée activée peuvent créer un fichier dans /etc/exim4/conf.d/transports.

Ici’sa transport qui invoque un script PHP :

example_transport : driver = pipe command = /usr/bin/php /var/www/html/handle_incoming_email.php user = www-data groupe = www-data

Lorsqu'il est combiné avec l'exemple de routeur ci-dessus, tout e-mail envoyé à @example.com sera envoyé à handle_incoming_email.php. Exim fournit l'intégralité de l'e-mail au format compatible RFC en tant qu'entrée standard de la commande que vous pouvez lire dans votre langage de programmation.

//Obtenez le contenu de l'e-mail à partir de l'entrée standard en PHP $email = fopen(&quot ;php://stdin", "r");   //À : user@example.com //Objet : E-mail de démonstration ////Ceci est un e-mail.

Le transport est configuré avec le pilote de tuyau. Cela utilise un tube Unix pour fournir l'e-mail entrant à votre commande. La commande sera exécutée en tant qu'utilisateur et groupe que vous spécifiez.

Utilisation des variables d'environnement

Exim définira plusieurs variables d'environnement avant d'exécuter votre commande. Ceux-ci peuvent être utilisés pour accéder aux informations sur le message sans avoir à analyser le format complet de l'e-mail.

Les variables disponibles incluent :

  • DOMAIN – Le domaine auquel l'e-mail entrant a été envoyé.
  • MESSAGE_ID – ID interne d'Exim représentant l'e-mail.
  • DESTINATAIRE – L'adresse e-mail à laquelle le message a été envoyé.
  • SENDER – L'adresse e-mail d'où provient le message.

Vous pouvez ajouter des variables supplémentaires à l'environnement de la commande en définissant l'option d'environnement dans votre transport. Cela accepte une liste de paires clé-valeur séparées par des virgules :

example_transport: environment = foo=bar,demo=example

Valeurs de retour

Votre commande doit se terminer avec un code d'état 0 pour confirmer une livraison réussie. Un code de sortie différent de zéro sera interprété comme un échec de livraison. L'expéditeur recevra un message de rebond.

Publicité

Ce comportement est désactivé en définissant l'option ignore_status dans votre transport. Exim traitera alors les codes d'état non nuls comme réussis.

De plus, vous pouvez utiliser l'option temp_errors pour définir des codes de sortie de script qui indiquent qu'une erreur a été rencontrée mais qu'elle devrait être temporaire. Lorsqu'Exim voit l'un de ces codes d'état, la livraison du message est différée et réessayée ultérieurement.

Le contenu des messages de rebond peut être personnalisé avec l'option return_fail_output. Lorsque cela est défini sur true, Exim inclura le contenu de la sortie standard de votre script dans son e-mail de rebond. Le mécanisme facilite l'utilisation du code de votre application pour fournir des réponses de rebond personnalisées aux expéditeurs.

Invocation de commande

Exim appelle généralement votre commande directement depuis le transport. Si vous définissez l'option use_shell, il passera la commande à /bin/sh à la place. Cela peut être utile dans les scénarios où votre script nécessite qu'un environnement shell complet soit disponible.

L'exécution de la commande expire après une heure avec la configuration par défaut. Un timeout est traité comme une erreur de livraison. La commande sera terminée et un message de rebond sera renvoyé à l'expéditeur. Le délai d'attente peut être personnalisé avec le paramètre de délai d'attente. De plus, la définition de l'option timeout_defer entraînera le traitement des délais d'attente comme des erreurs temporaires, permettant une autre tentative de livraison après un délai.

example_transport : timeout = 5m timeout_defer Publicité

Vous devez également considérer que votre script peut être exécuté simultanément si plusieurs e-mails arrivent en même temps. Votre application doit pouvoir résister à cette éventualité. Les systèmes de verrouillage qui permettent à une seule instance de s'exécuter simultanément doivent être désactivés pour votre script de gestion des e-mails.

Conclusion

Exim est facilement configuré pour acheminer les e-mails entrants vers le vôtre application. Une configuration simple qui dirige tous les messages reçus peut être réalisée avec un routeur de base couplé à un transport utilisant le pilote pipe.

Vous devez fournir un binaire qui accepte un e-mail sur l'entrée standard dans le cadre de votre application. Le binaire sera invoqué par Exim chaque fois qu'un nouveau message est reçu. Vous devez ensuite analyser l'e-mail d'une manière conforme aux normes pour extraire le contenu du corps et les en-têtes de message pertinents pour votre système.