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

Respuestas:
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 fuitransport_maps. La clave es hacer 5 cosas:/etc/postfix/master.cfpara canalizar el correo al script./etc/postfix/main.cfuso del transporte db paratransport_mapsy el alias db paravirtual_alias-maps.(1) Crear
/etc/postfix/virtual_aliasespara agregar un alias general:localuserdebe ser un usuario local existente:(2) Crear
/etc/postfix/transportpara agregar una asignación de transporte. "mytransportname" puede ser lo que quieras; se usa a continuación enmaster.cf:(3) A continuación, ambos
transportyvirtual_aliasesdeben compilarse en archivos berkeley db:(4) Agregue el transporte a
/etc/postfix/master.cf:(5) En
/etc/postfix/main.cf:Y ... ¡listo! Sheesh
fuente
relay_domains(en cuyo caso el archivo de transporte puede filtrar en función de la dirección To: real).virtual_transport = mailcaptcha:inmain.cfymailcaptcha unix - n n - - pipe flags=FR user=vmail argv=/usr/bin/perl /usr/local/mail-captcha/verify.pl ${sender} ${recipient}inmaster.cf. Consulte postfix.org/transport.5.html y postfix.org/VIRTUAL_README.html .postfix restartoreloado algo así? Lo último: ¿hay un archivo de registro para ver los correos que llegaron a postfix?/var/log/mail.log.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:
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.
fuente
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 lasmaildir/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.
fuente
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í comovirtual_alias_mapsy asegurarse de que el mapeo virtual fue almy-alias@localhostlugar de sólomy-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:
10 mail.your-domain-namesudo apt-get install postfixsudo vi /etc/postfix/main.cfmydestinationvaloreshasta el final del archivo
sudo apt-get vi /etc/aliasessudo newaliasessudo apt-get vi /etc/postfix/virtual_domains(los campos #dominio suprimen las advertencias)
sudo postmap /etc/postfix/virtual_domainssudo apt-get vi /etc/postfix/virtualsudo postmap /etc/postfix/virtualsudo /etc/init.d/postfix reloadfuente