Ejecutar script al recibir el correo electrónico

8

Ejecuto un servidor de correo Postfix / Dovecot para uso personal. Solo hay un puñado de buzones reales, esencialmente justos [email protected]y [email protected].

Con frecuencia utilizo el virtualarchivo para crear buzones virtuales a los que se reenvía [email protected]. Tengo varios de estos para cuentas desechables, como compras únicas en tiendas en línea, juegos en línea que quiero probar sin preocuparme por el spam en curso, etc. Para hacerlo, utilizo SSH y ejecuto los siguientes comandos:

sudo vim /etc/postfix/virtual
# add a line that looks like:
# # [email protected]      [email protected]
sudo postmap virtual
sudo service postfix restart

Hago esto con suficiente frecuencia que me gustaría automatizar el proceso hasta cierto punto. Pensé simplemente en escribir un script de shell que tomara el buzón virtual y el buzón real como argumentos e hiciera los cambios en sí, pero espero algo aún más fácil.

Me gustaría poder enviar un correo electrónico desde [email protected]otro buzón del servidor con el nombre del buzón virtual como cuerpo del mensaje. El problema serían las sudollamadas, pero puedo crear un nuevo usuario cuya única responsabilidad es manejar esto, que debería manejar eso.

Principalmente la pregunta es esta: ¿cómo crearía un evento que se activaría por correo electrónico? ¿Hay algún servicio en algún lugar que haga esto? ¿Puedo configurar Postfix o Dovecot para escuchar ese correo electrónico y ejecutar comandos en ese evento?

Adam Smith
fuente
¿Has revisado este enlace ?
Kirill-a
@ Kirill-a no, no lo había hecho. Parece que eso podría tener la intención de resolver este problema, y ​​ahora finalmente tengo una buena razón para aprender PHP
Adam Smith
No necesita aprender PHP: simplemente sustituya su propio script de shell por el script PHP, y ya está.
MariusMatutiae
@MariusMatutiae si usted o kirill-a quisieran escribir una respuesta sobre el tema (suponiendo que funcione) felizmente otorgaré la recompensa
Adam Smith
@ kirill-un ping de cortesía para mi comentario, arriba.
Adam Smith

Respuestas:

8

El procedimiento correcto para ejecutar un script (uso un script de shell) al recibir un mensaje de correo es el siguiente. Implica modificar el archivo de configuración de postfix , master.cf (que, en mi Debian, se encuentra en / etc / postfix ) agregando la siguiente línea:

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

que indica a postfix que ejecute el script (debe hacerlo ejecutable) cuando se produce algún evento.

Para especificar cuándo ejecutar el script, haga lo siguiente: suponga que desea que se ejecute cuando [email protected] reciba un mensaje. Coloca la siguiente línea

 [email protected] FILTER my_shell_script:dummy

dentro del archivo /etc/postfix/address.txt ; necesitará crear una base de datos adecuada para postfix para usar este archivo, lo que logrará mediante

  postmap /etc/postfix/address.txt

que produce como salida un archivo llamado /etc/postfix/address.db . Ahora regrese al archivo /etc/postfix/main.cf y agregue la siguiente línea:

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

Ahora reinicie postfix ,

  postfix reload

y deberías estar listo para ir.

MariusMatutiae
fuente
2
¿No quiere decir 'check_recipient_access hash: / etc / postfix / address' aquí? Usó "acceso" donde creo que quiso decir "dirección", según sus instrucciones.
Lee Fuller
3
¿Es lo mismo si está ejecutando virtual_mailboxes para varios dominios virtuales? He seguido estas instrucciones textualmente, y si no declaro un virtual_alias obtengo un rebote. Si lo hago, entrega el mensaje al buzón pero no activa el script.
Lee Fuller
No conseguí que esto funcionara. Esta respuesta funcionó: serverfault.com/questions/322657/…
jlh
Por lo que entiendo, esta solución también tiene el problema de que solo se activará para los mensajes recibidos a través de SMTP. sendmaildirecto en el servidor no activará esto.
Philip Couling
@PhilipCouling Vea esta respuesta: unix.stackexchange.com/a/179407 . Puedes usar la pickupopción.
Stephan
4

Puedo ver dos soluciones obvias.

Si está utilizando procmail como MDA en su servidor, o está dispuesto a convertirlo para usarlo, puede ejecutar cualquier script arbitrario en cualquier correo electrónico arbitrario a través de la |acción de receta (pipe) de procmail . Esperemos que no se inicie como root, pero debería ser fácil crear un script que realice la magia requerida y que un usuario relevante pueda invocar sin contraseña como root. El resultado de la secuencia de comandos incluso podría retroalimentarse en el mismo correo electrónico y el correo electrónico entregado más tarde haciendo que la receta sea una acción de filtro.

Una alternativa (que debería requerir menos mantenimiento práctico) es crear un solo buzón y configurar Postfix$recipient_delimiter para que sea algo que normalmente no se usa para ese propósito; por ejemplo, .o -. Tenga en cuenta que recipiente_delímetro es una configuración de todo el servidor. Digamos que configuró el buzón [email protected]y lo configuró $recipient_delimeter = .. Esto permitirá dummy.<anything>@example.comque se entregue al buzón local correspondiente a [email protected]. Para deshabilitar uno de estos, agreguedummy.<whatever>@example.coma una tabla de destinatarios apropiada con una acción de rechazo. La desventaja es que será un buzón general para el prefijo, por lo que querrá hacer que el prefijo sea difícil de encontrar por accidente o ataques de diccionario. La ventaja es que, en el caso normal (el remitente respeta sus deseos y no revende su dirección de correo electrónico), este enfoque requiere cero mantenimiento, y siempre puede cambiar su prefijo más adelante y enumerar explícitamente las combinaciones para las que desea seguir recibiendo correo. .

un CVn
fuente
No estoy atado a Postfix por ningún otro motivo que no sea el que tengo actualmente. Sin embargo, preferiría encontrar una solución que funcione con mi MDA / MTA actual. En cuanto al delimitador: apenas confío en que el remitente respetará mis deseos y no revenderá mi dirección de correo electrónico, o les estaría dando la dirección permanente :)
Adam Smith
@AdamSmith La diferencia es que, con algo como mi segunda alternativa, puede deshabilitar la dirección que le dio a una entidad en particular sin causar problemas en ningún otro lado, y las direcciones se ven razonables incluso para los verificadores automáticos tontos. En cuanto a mantener el MDA / MTA, procmail se puede usar como un reemplazo directo para el MDA de Postfix; no es necesario reemplazar Postfix como su MTA.
un CVn el
procmail ya no se mantiene: vea lwn.net/Articles/416901 , un artículo con título: Los informes de la muerte de procmail no son terriblemente exagerados. Es mejor que sea seguro y siga las sugerencias de @ kirill-a.
MariusMatutiae
procmail todavía se usa mucho y (en mi humilde opinión) sigue siendo la mejor solución para el filtrado ad hoc. La nota de @MariusMatutiae de que está efectivamente muerto se aplica únicamente a su desarrollo. No puedo pensar en ningún error de procmail que haya experimentado, y he hecho cosas ridículas como implementar listas de correo completas. Tal vez no ha recibido más desarrollo porque la única dirección para tomarlo estaría más allá de su alcance (por ejemplo, antispam, mejor atendido por SpamAssassin o, por ejemplo, milter-greylist ).
Adam Katz
¿Y me estás diciendo esto porque ...?
MariusMatutiae
2

En caso de que el enlace se caiga, aquí hay un resumen.

Primero, vaya master.cfy registre su script "myhook" agregando la siguiente línea:

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

Además, edite la línea smtp para indicarle a Postfix que ejecute el filtro para cualquier correo que llegue a través de la entrega SMTP:

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

Tenga en cuenta que si envía correos utilizando el comando "sendmail", el filtro no se activará. En este caso, agregue la opción después del método de entrega "recogida":

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

Reiniciar postfix: postfix reload

Haga que su script sea legible y ejecutable por cualquiera: chmod +rx script.sh

Tenga en cuenta que el script siempre se activa para cualquier correo que llegue. Para especificar la dirección exacta, consulte la respuesta @MariusMatutiae.

kirill-a
fuente
que me dio "error de transporte de correo desconocido" ...
user1133275