web-dev-qa-db-fra.com

Comment configurer postfix pour diriger tous les e-mails entrants vers un script?

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
24
user67641

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:

  1. Configurer un fichier db pour gérer les alias (et ajouter un alias fourre-tout)
  2. Configurez un fichier db pour mapper le "transport" du domaine en question à un gestionnaire spécial.
  3. Compilez les fichiers db au format db berkeley souhaité par postfix.
  4. Configurez le gestionnaire dans /etc/postfix/master.cf pour diriger le courrier vers le script.
  5. Ensemble /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.

32
user67641

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;
    }
}
4
Greeblesnort

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:

  • Configurez vos enregistrements A et MX pour votre domaine, l'enregistrement A @ pointant vers l'IP du serveur sur lequel vous allez recevoir des e-mails et MX avec le nom d'hôte @ et la valeur 10 mail.your-domain-name
  • Sudo apt-get install postfix
  • Sélectionnez "Site Internet" et entrez votre nom de domaine (entièrement qualifié)
  • Sudo vi /etc/postfix/main.cf
  • Ajoutez mail.your-domain-name à la liste des valeurs mydestination
  • Ajouter
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
0
therightstuff

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.

0
Jonathan Ross