En utilisant postfix, j'aimerais que tout le courrier entrant, vers n'importe quelle adresse (y compris celles qui ne mappent pas aux utilisateurs locaux) soit redirigé vers un script. J'ai essayé de configurer mailbox_command
dans /etc/postfix/main.cf
:
mailbox_command = /path/to/myscript.py
Cela fonctionne très bien si l'utilisateur est un utilisateur local, mais il échoue pour les utilisateurs "inconnus" qui n'ont pas d'alias. J'ai essayé de définir luser_relay
à un utilisateur local, mais cela prévient mailbox_command
, et donc la commande n'est pas exécutée. J'ai essayé de définir local_recipient_maps=
(chaîne vide), mais le message est toujours renvoyé (utilisateur inconnu).
Y a-t-il une invocation magique que je peux utiliser pour que tous les utilisateurs connus et inconnus accèdent également au script?
Plein /etc/postfix/main.cf
suit - c'est le Ubuntu 10.04 par défaut, à l'exception du mailbox_command
ligne:
# 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
Ok, je viens de faire fonctionner ça - bien que plus poilu que je ne le pensais. J'ai laissé tomber le maildir_command
partie, et est allé avec transport_maps
. La clé est de faire 5 choses:
/etc/postfix/master.cf
pour diriger le courrier vers le script./etc/postfix/main.cf
pour utiliser la base de données de transport pour transport_maps
, et l'alias db pour virtual_alias-maps
.(1) Créez /etc/postfix/virtual_aliases
pour ajouter un alias fourre-tout - localuser
doit être un utilisateur local existant:
@mydomain.tld [email protected]
(2) Créez /etc/postfix/transport
pour ajouter un mappage de transport. "mytransportname" peut être ce que vous voulez; il est utilisé ci-dessous dans master.cf
:
mydomain.tld mytransportname:
(3) Ensuite, transport
et virtual_aliases
doivent être compilés dans des fichiers db berkeley:
$ Sudo postmap /etc/postfix/virtual_aliases
$ Sudo postmap /etc/postfix/transport
(4) Ajoutez le transport à /etc/postfix/master.cf
:
mytransportname unix - n n - - pipe
flags=FR user=localuser argv=/path/to/my/script.py
${nexthop} ${user}
(5) Dans /etc/postfix/main.cf
:
...
transport_maps = hash:/etc/postfix/transport
virtual_alias_maps = hash:/etc/postfix/virtual_aliases
Et ... c'est bon! Sheesh.
La seule fois où j'ai utilisé quelque chose comme ça, c'était pour la boîte aux lettres d'un utilisateur spécifique. Tout ce qui était nécessaire était d'alias le nom de cet utilisateur à un canal et un processus dans les alias:
pong: "| /usr/local/bin/gotit.pl"
Cela a envoyé du trafic destiné à "[email protected]" vers un script Perl que j'ai écrit pour le traiter.
gotit.pl (à titre d'exemple, ne me harcelez pas pour la programmation merde skillz =). Son travail consistait à traiter un e-mail que j'avais envoyé à notre serveur Exchange (où il était répondu automatiquement via un code VB) pour vérifier qu'Exchange traitait les e-mails en temps opportun. Sinon , le serveur de messagerie envoyait un e-mail d'alerte à nos pagers et écrivait un fichier de verrouillage afin que nous ne soyons pas constamment spammés.
#! /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;
}
}
Après beaucoup de maux de tête, j'ai mis en place cette solution basé sur quelques sources différentes qui ont entraîné beaucoup moins d'efforts, les étapes critiques configuraient virtual_alias_domains
aussi bien que virtual_alias_maps
et en vous assurant que le mappage virtuel était sur my-alias@localhost
au lieu de simplement my-alias
. Dans mon exemple, l'alias de commande consiste à diriger l'e-mail vers un point de terminaison d'API de site Web, mais il pourrait tout aussi facilement être dirigé vers autre chose.
Voici les étapes à suivre:
10 mail.your-domain-name
Sudo apt-get install postfix
Sudo vi /etc/postfix/main.cf
mydestination
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_alias_maps = hash:/etc/postfix/virtual
à la fin du fichier
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
(les champs #domain suppriment les avertissements)
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
J'ai utilisé un ancien "fichier plat" Mailbox
pour recevoir tout le courrier (puis le tailler toutes les quelques heures s'il est volumineux), au lieu d'utiliser les dossiers modernes maildir/
, Pour traiter le courrier grâce à des scripts. Vous pouvez également exécuter logrotate sur le fichier, je suppose pour le garder gérable.
De cette façon, vous pouvez simplement copier tous les messages dans une boîte aux lettres en tant qu'utilisateur local.