Hoe u inkomende e-mail naar uw toepassing stuurt met Exim

0
47
dwori/Shutterstock.com

Exim is een populaire Message Transfer Agent (MTA) voor Unix-systemen. Het biedt een breed scala aan routerings- en transportmogelijkheden. In dit artikel laten we zien hoe je Exim kunt gebruiken om inkomende e-mails door te sturen naar je eigen script.

We gaan ervan uit dat je al een werkende Exim-server hebt die ;s in staat om e-mail te ontvangen. De officiële wiki biedt informatieve begeleiding als je helemaal opnieuw begint met een nieuwe installatie.

Exim-configuratie beheren

Beschikbare configuratiebenaderingen verschillen per besturingssysteemdistributie. Een Exim-installatie die vanaf de broncode is gebouwd, gebruikt src/configure.default als configuratiebestand.

Het bestand voor Exim dat vanuit een pakketbeheerder wordt geïnstalleerd, is meestal /etc/exim/config of /etc/exim.conf. U kunt het pad vinden dat momenteel wordt gebruikt door exim -bP configure_file uit te voeren.

Op Debian gebaseerde besturingssystemen hebben een iets gecompliceerder systeem. Er zijn twee mogelijke configuratiemethoden: een enkel bestand, /etc/exim4/exim4.conf.template, of gesplitste configuratiebestanden in /etc/exim4/conf.d. U moet update-exim4.conf uitvoeren nadat u wijzigingen hebt aangebracht. Dit creëert een enkel samengevoegd bestand dat daadwerkelijk door Exim wordt gelezen.

Advertentie

Exim moet elke keer dat u de configuratie wijzigt opnieuw worden gestart. Voer service exim4 restart uit om uw wijzigingen toe te passen.

Een router maken

De eerste stap om e-mail naar uw toepassing te krijgen, is het definiëren van een aangepaste router. Routers vergelijken inkomende e-mails met een reeks voorwaarden om te bepalen welk leveringsmechanisme moet worden gebruikt.

Routers worden verwerkt in de volgorde waarin ze in het configuratiebestand worden gevonden. Alle routers boven de jouwe in het bestand kunnen als eerste overeenkomen met inkomende e-mails.

Voeg uw router toe aan uw configuratiebestand in het gedeelte ROUTERS CONFIGURATIE. Als u de gesplitste Debian-configuratie gebruikt, kunt u in plaats daarvan een nieuw bestand maken in /etc/exim4/conf.d/routers. Routers worden in alfabetische volgorde gecombineerd wanneer u deze aanpak gebruikt.

Hier is een voorbeeldrouter:

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

This is een basisrouter die overeenkomt met elke e-mail die naar voorbeeld.com wordt verzonden. Wanneer een match is verwerkt, zal Exim het bericht accepteren en afleveren met het voorbeeld_transport transport. We zullen dit hierna maken.

Een transport maken

Zodra een e-mail door een router is geaccepteerd, wordt deze afgeleverd door een transporteur. Transporten zijn verantwoordelijk voor het implementeren van de routine voor het bezorgen van berichten. Verschillende chauffeurs kunnen via internet verzenden met SMTP, overdragen naar een lokale Unix-gebruiker of naar een bestand schrijven.

Advertentie

Door een aangepast transport te maken op basis van een ingebouwd stuurprogramma, kunt u overeenkomende e-mails bezorgen naar uw eigen aanvraag. U kunt dan elke e-mail afzonderlijk behandelen, buiten Exim om.

In tegenstelling tot routers maakt de volgorde van transporten niet uit. Elke inkomende e-mail komt overeen met het enkele transport dat is gespecificeerd door de router die het accepteert. Voeg uw transport overal toe in het gedeelte TRANSPORTCONFIGURATIE van uw Exim-bestand. Debian-gebruikers met gesplitste configuratie ingeschakeld kunnen een bestand aanmaken in /etc/exim4/conf.d/transports.

Hier is een transport dat een PHP-script aanroept:

voorbeeld_transport: driver = pipe command = /usr/bin/php /var/www/html/handle_incoming_email.php gebruiker = www-data group = www-data

In combinatie met de voorbeeldrouter van hierboven, wordt elke e-mail die naar @example.com wordt verzonden, afgeleverd bij handle_incoming_email.php. Exim levert de volledige e-mail in RFC-compatibel formaat als de standaardinvoer van de opdracht die u in uw programmeertaal kunt lezen.

//Ontvang e-mailinhoud van standaardinvoer in PHP $email = fopen(&quot ;php://stdin", "r");   //Aan: gebruiker@example.com //Onderwerp: Demo-e-mail ////Dit is een e-mail.

Het transport wordt geconfigureerd met de pipe driver. Dit gebruikt een Unix-pipe om de inkomende e-mail aan uw opdracht te leveren. Het commando wordt uitgevoerd als de gebruiker en groep die je specificeert.

Omgevingsvariabelen gebruiken

Exim zal verschillende omgevingsvariabelen instellen voordat het je commando uitvoert. Deze kunnen worden gebruikt om toegang te krijgen tot informatie over het bericht zonder het volledige e-mailformaat te hoeven ontleden.

Beschikbare variabelen zijn onder meer:

  • DOMAIN – Het domein waarnaar de inkomende e-mail is verzonden.
  • MESSAGE_ID – Exim’s interne ID die de e-mail vertegenwoordigt.
  • ONTVANGER – Het e-mailadres waarnaar het bericht is verzonden.
  • SENDER – Het e-mailadres waarvan het bericht afkomstig is.

U kunt extra variabelen toevoegen aan de omgeving van het commando door de omgevingsoptie in uw transport in te stellen. Dit accepteert een door komma's gescheiden lijst van sleutel-waardeparen:

example_transport: environment = foo=bar,demo=example

Return Values

Uw opdracht moet worden afgesloten met een 0 statuscode om een ​​succesvolle levering te bevestigen. Een exit-code die niet nul is, wordt geïnterpreteerd als een mislukte levering. De afzender ontvangt een bounce-bericht.

Advertentie

Dit gedrag wordt uitgeschakeld door de negeer_status-optie in uw transport in te stellen. Exim behandelt dan niet-nul statuscodes als succesvol.

Daarnaast kunt u de optie temp_errors gebruiken om scriptafsluitcodes te definiëren die aangeven dat er een fout is opgetreden, maar die naar verwachting tijdelijk is. Wanneer Exim een ​​van deze statuscodes ziet, wordt de bezorging van berichten uitgesteld en later opnieuw geprobeerd.

De inhoud van teruggestuurde berichten kan worden aangepast met de optie return_fail_output. Als dit is ingesteld op waar, zal Exim de inhoud van de standaarduitvoer van uw script opnemen in de bounce-e-mail. Het mechanisme vergemakkelijkt het gebruik van uw applicatiecode om gepersonaliseerde bounce-reacties aan afzenders te leveren.

Command Invocation

Exim roept uw ​​commando meestal rechtstreeks vanuit het transport op. Als je de use_shell optie instelt, zal het de opdracht in plaats daarvan doorgeven aan /bin/sh. Dit kan handig zijn in scenario's waarin uw script een volledige shell-omgeving vereist om beschikbaar te zijn.

De uitvoering van de opdracht verloopt na een uur met de standaardconfiguratie. Een time-out wordt behandeld als een leveringsfout. De opdracht wordt beëindigd en er wordt een bouncebericht teruggestuurd naar de afzender. De time-out kan worden aangepast met de time-outinstelling. Bovendien zorgt het instellen van de optie timeout_defer ervoor dat time-outs worden behandeld als tijdelijke fouten, waardoor een nieuwe bezorgpoging na een vertraging mogelijk wordt.

example_transport: timeout = 5m timeout_defer Advertentie

U moet er ook rekening mee houden dat uw script mogelijk wordt uitgevoerd gelijktijdig als er meerdere e-mails tegelijkertijd binnenkomen. Uw aanvraag moet deze mogelijkheid kunnen weerstaan. Vergrendelingssystemen waarmee slechts één exemplaar tegelijk kan worden uitgevoerd, moeten worden uitgeschakeld voor uw script voor e-mailverwerking.

Conclusie

Exim kan eenvoudig worden geconfigureerd om inkomende e-mail naar uw eigen script te routeren sollicitatie. Een eenvoudige installatie die alle ontvangen berichten doorstuurt, kan worden bereikt met een basisrouter die is gekoppeld aan een transport met behulp van de pipe-driver.

U moet een binair bestand opgeven dat een e-mail op standaardinvoer accepteert als onderdeel van uw toepassing. Het binaire bestand wordt door Exim aangeroepen wanneer een nieuw bericht wordt ontvangen. U moet de e-mail vervolgens ontleden op een manier die voldoet aan de normen om de hoofdtekst en berichtkoppen te verwijderen die relevant zijn voor uw systeem.