Come indirizzare la posta in arrivo alla tua applicazione con Exim

0
180
dwori/Shutterstock.com

Exim è un popolare agente di trasferimento dei messaggi (MTA) per i sistemi Unix. Offre un'ampia varietà di opzioni di percorso e trasporto. In questo articolo, mostreremo come utilizzare Exim per convogliare le email in arrivo nel tuo script.

Daremo per scontato che tu abbia già un server Exim funzionante che ;s in grado di ricevere e-mail. Il wiki ufficiale fornisce una guida informativa se stai iniziando da zero con una nuova installazione.

Gestione della configurazione Exim

Gli approcci alla configurazione disponibili variano in base alla distribuzione del sistema operativo. Un'installazione Exim creata dai sorgenti utilizzerà src/configure.default come file di configurazione.

Il file per Exim installato da un gestore di pacchetti è in genere /etc/exim/config o /etc/exim.conf. Puoi trovare il percorso attualmente utilizzato eseguendo exim -bP configure_file.

I sistemi operativi basati su Debian hanno un sistema leggermente più complicato. Ci sono due possibili metodi di configurazione: un singolo file, /etc/exim4/exim4.conf.template, o file di configurazione divisi all'interno di /etc/exim4/conf.d. È necessario eseguire update-exim4.conf dopo aver apportato modifiche. Questo crea un singolo file unito che viene effettivamente letto da Exim.

Annuncio

Exim dovrebbe essere riavviato ogni volta che si modifica la sua configurazione. Esegui il riavvio del servizio exim4 per applicare le modifiche.

Creazione di un router

Il primo passo per inviare la posta alla tua applicazione è definire un router personalizzato. I router confrontano le email in arrivo con una serie di condizioni per determinare il meccanismo di consegna da utilizzare.

I router vengono elaborati nell'ordine sequenziale in cui si trovano nel file di configurazione. Qualsiasi router sopra il tuo nel file potrebbe corrispondere per primo alle email in arrivo.

Aggiungi il tuo router al file di configurazione nella sezione CONFIGURAZIONE ROUTERS. Se stai usando la configurazione Debian divisa, puoi invece creare un nuovo file in /etc/exim4/conf.d/routers. I router verranno combinati in ordine alfabetico quando utilizzi questo approccio.

Ecco un esempio di router:

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

Questo è un router di base che corrisponde a qualsiasi email inviata a example.com. Quando viene elaborata una corrispondenza, Exim accetterà il messaggio e lo consegnerà utilizzando il trasporto example_transport. Lo creeremo in seguito.

Creazione di un trasporto

Una volta che un'e-mail è stata accettata da un router, viene consegnata da un mezzo di trasporto. I trasporti sono responsabili dell'implementazione della routine di consegna dei messaggi. Diversi driver possono inviare su Internet utilizzando SMTP, trasferire a un utente Unix locale o scrivere su un file.

Pubblicità

La creazione di un trasporto personalizzato basato su un driver integrato ti consente di inviare e-mail corrispondenti alla propria applicazione. Puoi quindi gestire ogni email individualmente, al di fuori di Exim.

A differenza dei router, l'ordine dei trasporti non ha importanza. Ogni email in arrivo corrisponderà al singolo trasporto specificato dal router che lo accetta. Aggiungi il tuo trasporto ovunque nella sezione CONFIGURAZIONE TRASPORTI del tuo file Exim. Gli utenti Debian con la configurazione divisa abilitata possono creare un file in /etc/exim4/conf.d/transports.

Ecco un trasporto che richiama uno script PHP:

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

Se combinato con il router di esempio dall'alto, qualsiasi email inviata a @example.com verrà consegnata a handle_incoming_email.php. Exim fornisce l'intera e-mail in formato conforme a RFC come input standard del comando da leggere nel linguaggio di programmazione.

//Ottieni il contenuto dell'e-mail dall'input standard in PHP $email = fopen(&quot ;php://stdin", "r");   //A: user@example.com //Oggetto: E-mail demo ////Questa è un'e-mail.

Il trasporto è configurato con il pipe driver. Questo usa una pipe Unix per fornire l'e-mail in arrivo al tuo comando. Il comando verrà eseguito come utente e gruppo specificati.

Uso delle variabili d'ambiente

Exim imposterà diverse variabili d'ambiente prima di eseguire il comando. Questi possono essere utilizzati per accedere alle informazioni sul messaggio senza dover analizzare l'intero formato dell'e-mail.

Le variabili disponibili includono:

  • DOMINIO – Il dominio a cui è stata inviata l'email in arrivo.
  • MESSAGE_ID – ID interno Exim che rappresenta l'email.
  • DESTINATARIO – L'indirizzo email a cui è stato inviato il messaggio.
  • MITTENTE – L'indirizzo email da cui ha avuto origine il messaggio.

Puoi aggiungere ulteriori variabili all'ambiente del comando impostando l'opzione ambiente nel tuo trasporto. Questo accetta un elenco separato da virgole di coppie chiave-valore:

example_transport: ambiente = foo=bar,demo=example

Valori restituiti

Il tuo comando dovrebbe uscire con un codice di stato 0 per confermare una consegna avvenuta con successo. Un codice di uscita diverso da zero verrà interpretato come una consegna non riuscita. Il mittente riceverà un messaggio di mancato recapito.

Annuncio

Questo comportamento è disabilitato impostando l'opzione ignore_status nel tuo trasporto. Exim tratterà quindi i codici di stato diversi da zero come validi.

Inoltre, è possibile utilizzare l'opzione temp_errors per definire i codici di uscita dello script che indicano che è stato riscontrato un errore ma che dovrebbe essere temporaneo. Quando Exim vede uno di questi codici di stato, la consegna del messaggio verrà posticipata e ritentata in seguito.

Il contenuto dei messaggi di rimbalzo può essere personalizzato con l'opzione return_fail_output. Quando questo è impostato su true, Exim includerà il contenuto dell'output standard del tuo script nella sua email di rimbalzo. Il meccanismo facilita l'uso del codice dell'applicazione per fornire risposte di rimbalzo personalizzate ai mittenti.

Command Invocation

Exim di solito invoca il tuo comando direttamente dal trasporto. Se imposti l'opzione use_shell, passerà invece il comando a /bin/sh. Questo può essere utile negli scenari in cui lo script richiede la disponibilità di un ambiente shell completo.

L'esecuzione del comando scade dopo un'ora con la configurazione predefinita. Un timeout viene trattato come un errore di consegna. Il comando verrà terminato e al mittente verrà restituito un messaggio di rimbalzo. Il timeout può essere personalizzato con l'impostazione del timeout. Inoltre, l'impostazione dell'opzione timeout_defer farà sì che i timeout vengano trattati come errori temporanei, consentendo un altro tentativo di consegna dopo un ritardo.

example_transport: timeout = 5m timeout_defer Advertisement

Dovresti anche considerare che il tuo script potrebbe essere eseguito contemporaneamente se più e-mail arrivano contemporaneamente. La tua applicazione dovrebbe essere in grado di sopportare questa possibilità. I sistemi di blocco che consentono l'esecuzione simultanea di una sola istanza dovrebbero essere disabilitati per lo script di gestione della posta.

Conclusione

Exim è facilmente configurabile per indirizzare la posta in arrivo alla tua applicazione. Una semplice configurazione che indirizza tutti i messaggi ricevuti può essere ottenuta con un router di base accoppiato a un trasporto utilizzando il driver pipe.

È necessario fornire un binario che accetti un'e-mail sull'input standard come parte dell'applicazione. Il binario verrà invocato da Exim ogni volta che viene ricevuto un nuovo messaggio. Dovresti quindi analizzare l'e-mail in modo conforme agli standard per estrarre il contenuto del corpo e le intestazioni dei messaggi rilevanti per il tuo sistema.