Esegui lo script alla ricezione dell'email


8

Corro un server di posta Postfix / Dovecot per uso personale. C'è solo una manciata di caselle postali effettive, essenzialmente solo postmaster@domain.come username@domain.com.

Uso spesso il virtualfile per creare cassette postali virtuali inoltrate a username@domain.com. Ne ho alcuni per account usa e getta come acquisti una tantum da negozi online, giochi online che voglio provare senza preoccuparmi dello spam in corso, ecc. Per farlo SSH ed eseguo i seguenti comandi:

sudo vim /etc/postfix/virtual
# add a line that looks like:
# # username_servicename@domain.com      username@domain.com
sudo postmap virtual
sudo service postfix restart

Faccio questo con abbastanza frequenza che mi piacerebbe automatizzare il processo in una certa misura. Ho pensato semplicemente di scrivere uno script di shell che prendesse la cassetta postale virtuale e la cassetta postale reale come argomenti e apportasse le modifiche stesse, ma spero in qualcosa di ancora più pratico.

Vorrei poter inviare un'e-mail da username@domain.comun'altra casella di posta sul server con il nome della casella di posta virtuale come corpo del messaggio. Il problema sarebbero le sudochiamate, ma posso creare un nuovo utente la cui unica responsabilità è gestirlo, che dovrebbe gestirlo.

Principalmente la domanda è questa: come creerei un evento che verrebbe attivato da un'e-mail? C'è un servizio da qualche parte che lo fa? Posso configurare Postfix o Dovecot per ascoltare quell'e-mail ed eseguire comandi su quell'evento?


Hai controllato questo link ?
Kirill-a

@ kirill-a no non l'avevo fatto. Sembra che potrebbe essere utile per risolvere questo problema, e ora ho finalmente una buona ragione per imparare il PHP
Adam Smith,

Non è necessario imparare PHP: basta sostituire il proprio script shell allo script PHP e il gioco è fatto.
MariusMatutiae,

@MariusMatutiae se tu o Kirill-a volete scrivere una risposta sull'argomento, allora (supponendo che funzioni), assegnerò felicemente la generosità
Adam Smith,

@ kirill-un ping di cortesia per il mio commento, sopra.
Adam Smith,

Risposte:


8

La procedura corretta per eseguire uno script (io uso uno script di shell) alla ricezione di un messaggio di posta è la seguente. Implica la modifica del file di configurazione di postfix , master.cf (che, nel mio Debian, si trova in / etc / postfix ) aggiungendo la seguente riga:

 my_shell_script unix - n n - - pipe flags=F user=MY_USERNAME argv=/path/to/my/shell/script ${sender} ${size} ${recipient}

che indica a postfix di eseguire lo script (è necessario renderlo eseguibile) quando si verifica un evento.

Per specificare quando eseguire lo script, fai come segue: supponi di volerlo eseguire quando username@domain.com riceve un messaggio. Posiziona la seguente riga

 username@domain.com FILTER my_shell_script:dummy

all'interno del file /etc/postfix/address.txt ; sarà necessario creare un database adeguato per postfix per utilizzare questo file, che si ottiene tramite

  postmap /etc/postfix/address.txt

che produce come output un file chiamato /etc/postfix/address.db . Ora torna al file /etc/postfix/main.cf e aggiungi la seguente riga:

 smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/access, permit_mynetworks, reject_unauth_destination

Ora riavvia postfix ,

  postfix reload

e dovresti essere bravo ad andare.


2
Non vuoi dire 'check_recipient_access hash: / etc / postfix / address' qui? Hai usato "accesso" dove penso che volevi dire "indirizzo", in base alle tue istruzioni.
Lee Fuller,

3
È lo stesso se esegui virtual_mailbox per vari domini virtuali? Ho seguito queste istruzioni alla lettera - e se non dichiaro un virtual_alias ottengo un rimbalzo. In tal caso, recapita il messaggio alla cassetta postale ma non attiva lo script.
Lee Fuller,

Non l'ho fatto funzionare. Questa risposta ha funzionato: serverfault.com/questions/322657/…
jlh

Da quanto ho capito, questa soluzione ha anche il problema che si innescherà solo per i messaggi ricevuti tramite SMTP. sendmaildiretto sul server non lo attiverà.
Philip Couling,

@PhilipCouling Vedi questa risposta: unix.stackexchange.com/a/179407 . Puoi usare l' pickupopzione.
Stephan,

4

Vedo due soluzioni ovvie.

Se stai usando procmail come MDA sul tuo server, o sei disposto a convertirlo a usarlo, allora puoi eseguire qualsiasi script arbitrario su qualsiasi email arbitraria tramite l' |azione ricetta (pipe) di procmail . Speriamo che non venga avviato come root, ma dovrebbe essere facile creare uno script che esegua la magia richiesta e che possa essere invocato senza password come root da un utente rilevante. L'output dello script potrebbe anche essere reinserito nella stessa e-mail e l'e-mail successivamente consegnata rendendo la ricetta un'azione di filtro.

Un'alternativa (che dovrebbe richiedere una minore manutenzione pratica) è quella di creare una singola casella di posta e configurare Postfix$recipient_delimiter come qualcosa che normalmente non viene utilizzato a tale scopo; per esempio, .o -. Si noti che recipient_delimeter è un'impostazione a livello di server. Supponiamo che tu abbia configurato la casella dummy@example.come- mail $recipient_delimeter = .. Ciò consentirà quindi dummy.<anything>@example.comche verrà recapitato alla cassetta postale locale corrispondente dummy@example.com. Per disabilitare uno di questi, aggiungeredummy.<whatever>@example.coma una tabella di destinatari appropriata con un'azione di rifiuto. Il rovescio della medaglia è che si tratterà di una cassetta postale generale per il prefisso, quindi si vorrebbe rendere il prefisso difficile da imbattersi in incidenti o attacchi di dizionario. Il lato positivo è che nel caso normale (il mittente rispetta i tuoi desideri e non rivende il tuo indirizzo email) questo approccio richiede zero manutenzione e puoi sempre modificare il prefisso in un secondo momento ed elencare esplicitamente quelle combinazioni per le quali desideri continuare a ricevere posta .


Non sono legato a Postfix per nessun motivo diverso da quello che ho attualmente. Preferirei trovare una soluzione che funzionasse con il mio attuale MDA / MTA. Per quanto riguarda i delimitatori: non mi fido del fatto che il mittente rispetti i miei desideri e non rivenda il mio indirizzo e-mail, o darei loro l'indirizzo permanente :)
Adam Smith,

@AdamSmith La differenza è che, con qualcosa come la mia seconda alternativa, puoi disabilitare l'indirizzo che hai dato a una particolare entità senza causare problemi altrove, e gli indirizzi sembrano sensati anche a stupidi verificatori automatici. Per quanto riguarda il mantenimento dell'MDA / MTA, procmail può essere utilizzato come sostituto drop-in per l'MDA Postfix; non è necessario sostituire Postfix come MTA.
un CVn del

procmail non viene più mantenuto: vedi lwn.net/Articles/416901 , un articolo dal titolo: le notizie sulla morte di procmail non sono terribilmente esagerate. Meglio giocare in sicurezza e seguire il suggerimento di @ kirill-a.
MariusMatutiae,

procmail è ancora molto usato e (IMHO) rimane la migliore soluzione per il filtraggio ad hoc. La nota di @ MariusMatutiae sulla sua effettiva morte si applica esclusivamente al suo sviluppo. Non riesco a pensare a nessun bug di procmail che io abbia mai sperimentato, e ho fatto cose ridicole come implementare mailing list complete in esso. Forse non ha ricevuto ulteriori sviluppi perché l'unica direzione da seguire sarebbe al di là del suo scopo (ad es. Anti-spam, meglio servito da SpamAssassin o ad esempio milter-greylist ).
Adam Katz,

E mi stai dicendo questo perché ...?
MariusMatutiae,

2

Nel caso in cui il collegamento non funzioni, ecco un riepilogo.

Innanzitutto, vai master.cfe registra il tuo script "myhook" aggiungendo la seguente riga:

myhook unix - n n - - pipe flags=F user=www-data argv=/path/to/script.sh ${sender} ${size} ${recipient}

Inoltre, modifica la linea smtp per dire a Postfix di eseguire il filtro per qualsiasi posta in arrivo tramite la consegna SMTP:

smtp inet n - - - - smtpd -o content_filter=myhook:dummy

Si noti che se si inviano e-mail utilizzando il comando "sendmail", il filtro non si attiverà. In questo caso, aggiungi l'opzione dopo il metodo di consegna "ritiro":

pickup fifo n - - 60 1 pickup -o content_filter=myhook:dummy

Riavvia postfix: postfix reload

Rendi la tua sceneggiatura leggibile ed eseguibile da chiunque: chmod +rx script.sh

Si noti che lo script viene sempre attivato per qualsiasi posta in arrivo. Per specificare l'indirizzo esatto vedere la risposta di @MariusMatutiae.


che mi ha procurato "errore di trasporto di posta sconosciuto" ...
user1133275
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.