Hur du skickar inkommande e -post till din ansökan med Exim

0
128
dwori/Shutterstock.com

Exim är en populär meddelandeöverföringsagent (MTA) för Unix -system. Det erbjuder ett brett utbud av routnings- och transportalternativ. I den här artikeln visar vi hur du använder Exim för att leda inkommande e -postmeddelanden till ditt eget skript.

Vi antar att du redan har en fungerande Exim -server som &#8217 ; kan ta emot e -post. Den officiella wikin ger informativ vägledning om du börjar från början med en ny installation.

Hantera Exim-konfiguration

Tillgängliga konfigurationsmetoder varierar beroende på operativsystemdistribution. En Exim -installation byggd från källan använder src/configure.default som konfigurationsfil.

Filen för Exim installerad från en pakethanterare är vanligtvis/etc/exim/config eller /etc/exim.conf. Du kan hitta sökvägen som för närvarande används genom att köra exim -bP configure_file.

Debianbaserade operativsystem har ett lite mer komplicerat system. Det finns två möjliga konfigurationsmetoder: en enda fil, /etc/exim4/exim4.conf.template, eller dela konfigurationsfiler inom /etc/exim4/conf.d. Du måste köra update-exim4.conf när du har gjort ändringar. Detta skapar en enda sammanfogad fil som faktiskt läses av Exim.

Annonsering

Exim bör startas om varje gång du ändrar konfigurationen. Kör service exim4 omstart för att tillämpa dina ändringar.

Skapa en router

Det första steget i att få e -post till din ansökan är att definiera en anpassad router. Routrar matchar inkommande e -postmeddelanden mot en uppsättning villkor för att avgöra vilken leveransmekanism som ska användas.

Routrar bearbetas i den ordningsföljd de hittades i konfigurationsfilen. Alla routrar över din i filen kan matcha inkommande e -postmeddelanden först.

Lägg till din router i din konfigurationsfil i avsnittet ROUTERS CONFIGURATION. Om du använder den delade Debian -konfigurationen kan du skapa en ny fil i /etc/exim4/conf.d/routers istället. Routrar kommer att kombineras i alfabetisk ordning när du använder detta tillvägagångssätt.

Här är en exempelrouter:

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

This är en grundläggande router som matchar alla e -postmeddelanden som skickas till example.com. När en matchning bearbetas kommer Exim att acceptera meddelandet och leverera det med exempel_transporttransporten. Vi kommer att skapa det här nästa.

Skapa en transport

När ett e -postmeddelande har accepterats av en router levereras det av en transport. Transport är ansvarig för att implementera meddelandeleveransrutinen. Olika drivrutiner kan skicka över internet med SMTP, överföra till en lokal Unix-användare eller skriva till en fil.

Annonsering

Genom att skapa en anpassad transport baserad på en inbyggd drivrutin kan du leverera matchande e-postmeddelanden till din egen ansökan. Du kan sedan hantera varje e -post individuellt, utanför Exim.

Till skillnad från routrar spelar transportens ordning ingen roll. Varje inkommande e -postmeddelande matchar den enda transport som anges av routern som accepterar det. Lägg till din transport var som helst i avsnittet TRANSPORTKONFIGURATION i din Exim -fil. Debian -användare med delad konfiguration aktiverad kan skapa en fil i /etc/exim4/conf.d/transports.

Här är en transport som åberopar ett PHP -skript:

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

När det kombineras med exempelroutern ovanifrån skickas alla e -postmeddelanden som skickas till @example.com till handle_incoming_email.php. Exim levererar hela e-postmeddelandet i RFC-kompatibelt format som kommandos standardinmatning för att du ska kunna läsa på ditt programmeringsspråk.

//Få e-postinnehåll från standardinmatning i PHP $ email = fopen ( & quot ; php: //stdin & quot ;, & quot; r & quot; &#41 ;; & nbsp; //Till: user@example.com //Ämne: Demomail ////Detta är ett mejl.

Transporten konfigureras med rörföraren. Detta använder ett Unix -rör för att leverera det inkommande e -postmeddelandet till ditt kommando. Kommandot körs som användaren och gruppen du anger.

Using Environment Variables

Exim ställer in flera miljövariabler innan du utför ditt kommando. Dessa kan användas för att komma åt information om meddelandet utan att behöva analysera hela e -postformatet.

Tillgängliga variabler inkluderar:

  • DOMAIN – Domänen som det inkommande e -postmeddelandet skickades till.
  • MESSAGE_ID – Exim's interna ID som representerar e -postmeddelandet.
  • MOTTAGARE – E -postadressen som meddelandet skickades till.
  • SENDER – E -postadressen som meddelandet härstammar från.

Du kan lägga till ytterligare variabler i kommandomiljön genom att ställa in miljöalternativet i din transport. Detta accepterar en kommaseparerad lista med nyckel-värdepar:

exempel_transport: miljö = foo = bar, demo = exempel

Returvärden

Ditt kommando bör avslutas med en statuskod 0 för att bekräfta en lyckad leverans. En utgångskod som inte är noll tolkas som en misslyckad leverans. Avsändaren får ett avvisningsmeddelande.

Annonsering

Detta beteende inaktiveras genom att ställa in alternativet ignorera_status i din transport. Exim behandlar sedan statuskoder som inte är noll som framgångsrika.

Dessutom kan du använda alternativet temp_errors för att definiera skriptutgångskoder som anger att ett fel uppstod men förväntas vara tillfälligt. När Exim ser en av dessa statuskoder, kommer meddelandeleveransen att skjutas upp och försökas igen senare.

Innehållet i avvisningsmeddelanden kan anpassas med alternativet return_fail_output. När detta är inställt på sant, kommer Exim att innehålla innehållet i ditt skripts standardutmatning i sin studsmail. Mekanismen underlättar användningen av din applikationskod för att leverera personliga avvisningssvar till avsändare.

Command Invocation

Exim åberopar vanligtvis ditt kommando direkt från transporten. Om du anger alternativet use_shell, kommer det att skicka kommandot till /bin /sh istället. Detta kan vara användbart i scenarier där ditt skript kräver att en fullständig skalmiljö är tillgänglig.

Kommandot körs ut efter en timme med standardkonfigurationen. En timeout behandlas som ett leveransfel. Kommandot avslutas och ett avvisningsmeddelande returneras till avsändaren. Tidsgränsen kan anpassas med inställningen för timeout. Om du ställer in alternativet timeout_defer kommer timeouts att behandlas som tillfälliga fel, vilket möjliggör ett nytt leveransförsök efter en fördröjning.

example_transport: timeout = 5m timeout_defer Annonsering

Du bör också tänka på att ditt skript kan köras samtidigt om flera mejl kommer samtidigt. Din ansökan ska kunna motstå denna möjlighet. Låsningssystem som tillåter att endast en instans körs samtidigt bör inaktiveras för ditt e -posthanteringsskript.

Slutsats

Exim konfigureras enkelt för att dirigera inkommande e -post till ditt eget Ansökan. En enkel installation som styr alla mottagna meddelanden kan uppnås med en grundläggande router kopplad till en transport med pipdrivrutinen.

Du måste tillhandahålla en binär som accepterar ett e -postmeddelande om standardinmatning som en del av din applikation. Den binära kommer att åberopas av Exim när ett nytt meddelande tas emot. Du bör sedan analysera e-postmeddelandet på ett standardkompatibelt sätt för att få fram innehållet i innehållet och meddelandehuvuden som är relevanta för ditt system.