¿Cómo configurar postfix para canalizar todo el correo electrónico entrante a un script?

24

Usando postfix, me gustaría que todo el correo entrante, a cualquier dirección (incluidas las que no se asignan a usuarios locales) se canalice a un script. He intentado configurar mailbox_commanden /etc/postfix/main.cf:

mailbox_command = /path/to/myscript.py

Esto funciona muy bien si el usuario es un usuario local, pero falla para los usuarios "desconocidos" que no tienen alias. Intenté configurarlo luser_relaypara un usuario local, pero esto se adelanta mailbox_command, por lo que el comando no se ejecuta. Intenté configurar local_recipient_maps=(cadena vacía), pero el mensaje aún se devuelve (usuario desconocido).

¿Existe una invocación mágica que pueda usar para que todos los usuarios conocidos y desconocidos también vayan al script?

Completo /etc/postfix/main.cfsigue: es el Ubuntu 10.04 predeterminado, con la excepción de la mailbox_commandlínea:

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

myhostname = ... snip ...
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = sassafras, ... snip ...,localhost.localdomain, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

mailbox_command = /path/to/my/script.py
usuario67641
fuente
Después del guión, ¿entonces qué? Esto suena como el tipo de cosas que hacen los escáneres de virus y los filtros de spam, ¿tal vez pueda encontrar una guía para configurar uno de ellos y usar su configuración para su script?
DerfK
Los mensajes van a una aplicación web. Entonces, después del script: una base de datos, otro procesamiento, otras cosas, pero no cosas de correo normal. La pregunta clave es hacer que los usuarios desconocidos no reboten, esto está fuera del escenario normal de virus / spam, donde rebotaría a los usuarios no asignados.
user67641
@ user67641 hola, ¿necesito inyectar el correo en postfix en mi script o agregando algunas líneas más en master.cf
merveotesi

Respuestas:

32

Ok, acabo de hacer que esto funcione, aunque más peludo de lo que pensé que sería. Dejé caer la maildir_commandparte y me fui transport_maps. La clave es hacer 5 cosas:

  1. Configure un archivo db para manejar alias (y agregue un alias general)
  2. Configure un archivo db para asignar el 'transporte' del dominio en cuestión a un controlador especial.
  3. Compile los archivos db en formato berkeley db que Postfix quiera.
  4. Configure el controlador /etc/postfix/master.cfpara canalizar el correo al script.
  5. Establezca el /etc/postfix/main.cfuso del transporte db para transport_mapsy el alias db para virtual_alias-maps.

(1) Crear /etc/postfix/virtual_aliasespara agregar un alias general: localuserdebe ser un usuario local existente:

@mydomain.tld   [email protected]

(2) Crear /etc/postfix/transportpara agregar una asignación de transporte. "mytransportname" puede ser lo que quieras; se usa a continuación en master.cf:

mydomain.tld    mytransportname:

(3) A continuación, ambos transporty virtual_aliasesdeben compilarse en archivos berkeley db:

$ sudo postmap /etc/postfix/virtual_aliases
$ sudo postmap /etc/postfix/transport

(4) Agregue el transporte a /etc/postfix/master.cf:

mytransportname   unix  -       n       n       -       -       pipe
  flags=FR user=localuser argv=/path/to/my/script.py
  ${nexthop} ${user}

(5) En /etc/postfix/main.cf:

  ...
  transport_maps = hash:/etc/postfix/transport
  virtual_alias_maps = hash:/etc/postfix/virtual_aliases

Y ... ¡listo! Sheesh

usuario67641
fuente
1
respuesta extremadamente útil
merveotesi
1
No se necesitan mapas de alias virtuales. Puede lograr lo mismo con relay_domains(en cuyo caso el archivo de transporte puede filtrar en función de la dirección To: real).
Brilliand
Descubrí que puede enrutar todo el correo virtual a un script con virtual_transport = mailcaptcha:in main.cfy mailcaptcha unix - n n - - pipe flags=FR user=vmail argv=/usr/bin/perl /usr/local/mail-captcha/verify.pl ${sender} ${recipient}in master.cf. Consulte postfix.org/transport.5.html y postfix.org/VIRTUAL_README.html .
Chloe
El (4) debe estar en una sola línea, ¿es así? Asimismo, no se requiere una postfix restarto reloado algo así? Lo último: ¿hay un archivo de registro para ver los correos que llegaron a postfix?
Basj
@Basj, el archivo de registro es /var/log/mail.log.
fiedl
4

La única vez que usé algo como esto fue para el buzón de un usuario específico. Todo lo que se requería era alias el nombre de ese usuario a una tubería y un proceso en alias:

pong: "| /usr/local/bin/gotit.pl"

Esto envió tráfico destinado a "[email protected]" a un script en perl que escribí para procesarlo.

gotit.pl (como ejemplo, no me molestes por la descuidada habilidad de programación =). Su trabajo consistía en procesar un correo electrónico que había enviado a nuestro servidor de Exchange (donde fue respondido automáticamente a través de algún código VB) para verificar que Exchange estaba procesando el correo electrónico de manera oportuna. De lo contrario, el servidor de correo enviaría un correo electrónico de alerta a nuestros buscapersonas y escribiría un archivo de bloqueo para que no recibiéramos correos no deseados constantemente.

#! /usr/bin/perl -w
use vars qw ( $mung $sent $tvalue $remainder $delta $fout );
$mung = time;
while (<STDIN>) {
    ($sent, $tvalue, $remainder ) = split /: /, $_, 3;
    $tvalue =~ s/(\D+)//g;
    chomp($tvalue);
    $delta = $mung-$tvalue;
    if ( $sent =~ "Sent" ) {
        $fout = "/var/spool/mailcheck/$tvalue";
        next unless ( -e $fout );
        open (TMP, "> $fout") or die "Couldn't open output file: $!\n";
        print TMP "Received in: $delta seconds.\n";
                close TMP;
        last;
    }
}
Greeblesnort
fuente
Sí, y simplemente redirige @ mydomain.tld a pong y se canalizarán todos los principales entrantes para mydomain.tld.
Zaar Hai
y para aquellos de nosotros que usamos múltiples dominios virtuales, no olviden redirigirlo a pong @ localhost para que no adjunte el nombre de dominio predeterminado al alias
therightstuff
0

He usado un "archivo plano" de estilo antiguo Mailboxpara recibir todo el correo (y luego podarlo cada pocas horas si es grande), en lugar de usar las maildir/carpetas modernas , para procesar el correo a través de scripts. También podría ejecutar logrotate sobre el archivo, supongo que lo mantendrá manejable.

De esta manera, simplemente podría copiar todo el correo a un buzón como usuario local.

Jonathan Ross
fuente
0

Después de un montón de dolores de cabeza que armó esta solución basada en un par de diferentes fuentes que dio lugar a mucho menos esfuerzo, los pasos críticos fueron configurando virtual_alias_domainsasí como virtual_alias_mapsy asegurarse de que el mapeo virtual fue al my-alias@localhostlugar de sólo my-alias. En mi ejemplo, el alias de comando es canalizar el correo electrónico a un punto final de API del sitio web, pero podría canalizar fácilmente a otra cosa.

Estos son los pasos que deberá seguir:

  • Configure sus registros A y MX para su dominio, el registro A @ apuntando a la IP del servidor en el que va a recibir correos electrónicos y MX con el nombre de host @ y el valor 10 mail.your-domain-name
  • sudo apt-get install postfix
  • Seleccione "Sitio de Internet" e ingrese su nombre de dominio (totalmente calificado)
  • sudo vi /etc/postfix/main.cf
  • Agregue mail.your-domain-name a la lista de mydestinationvalores
  • Adjuntar
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_alias_maps = hash:/etc/postfix/virtual

hasta el final del archivo

  • sudo apt-get vi /etc/aliases
curl_email: "|curl --data-binary @- http://your-domain-name/email"
  • sudo newaliases
  • sudo apt-get vi /etc/postfix/virtual_domains
example.net   #domain
example.com   #domain
your-domain-name   #domain

(los campos #dominio suprimen las advertencias)

  • sudo postmap /etc/postfix/virtual_domains
  • sudo apt-get vi /etc/postfix/virtual
info@your-domain-name [email protected]
everyone@your-domain-name [email protected] [email protected]
email_processor@your-domain-name curl_email@localhost
@your-domain-name [email protected]
[email protected] [email protected]
  • sudo postmap /etc/postfix/virtual
  • sudo /etc/init.d/postfix reload
lo correcto
fuente