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


24

En utilisant postfix, j'aimerais que tout le courrier entrant, à 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_commanddans /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_relayun utilisateur local, mais cela préempte mailbox_commandet la commande n'est donc pas exécutée. J'ai essayé de définir local_recipient_maps=(chaîne vide), mais le message est toujours renvoyé (utilisateur inconnu).

Existe-t-il une invocation magique que je peux utiliser pour que tous les utilisateurs connus et inconnus accèdent également au script?

Complet /etc/postfix/main.cfsuit - c'est le Ubuntu 10.04 par défaut, à l'exception de la mailbox_commandligne:

# 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

Après le script, alors quoi? Cela ressemble au genre de chose que font les scanners de virus et les filtres anti-spam, peut-être pouvez-vous trouver un guide pour en configurer un et utiliser sa configuration pour votre script?
DerfK

Les messages vont à une application Web. Donc après le script: une base de données, d'autres traitements, d'autres trucs, mais pas des trucs de messagerie normaux. La question clé est de faire en sorte que les utilisateurs inconnus ne rebondissent pas - cela est en dehors du scénario normal de virus / spam, où vous rebondiriez des utilisateurs non mappés.
user67641

@ user67641 salut ai-je besoin d'injecter le courrier dans postfix dans mon script ou en ajoutant quelques lignes supplémentaires dans master.cf
merveotesi

Réponses:


32

Ok, je viens de faire fonctionner ça - bien que plus poilu que je ne le pensais. J'ai laissé tomber la maildir_commandpièce et je suis partie 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 /etc/postfix/master.cfpour diriger le courrier vers le script.
  5. Définissez /etc/postfix/main.cfpour utiliser la base de données de transport pour transport_mapset la base de données d'alias pour virtual_alias-maps.

(1) Créer /etc/postfix/virtual_aliasespour ajouter un alias fourre-tout - localuserdoit être un utilisateur local existant:

@mydomain.tld   localuser@mydomain.tld

(2) Créez /etc/postfix/transportpour 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, les deux transportet virtual_aliasesdoivent ê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.


1
réponse extrêmement utile
merveotesi

1
Les mappages d'alias virtuels ne sont pas nécessaires. Vous pouvez accomplir la même chose avec relay_domains(auquel cas le fichier de transport peut filtrer en fonction de l'adresse To:).
Brilliand

J'ai trouvé que vous pouvez acheminer tout le courrier virtuel vers un script avec virtual_transport = mailcaptcha:in main.cfet mailcaptcha unix - n n - - pipe flags=FR user=vmail argv=/usr/bin/perl /usr/local/mail-captcha/verify.pl ${sender} ${recipient}in master.cf. Voir postfix.org/transport.5.html et postfix.org/VIRTUAL_README.html .
Chloe

Le (4) devrait être sur une seule ligne, n'est-ce pas? Ne nécessite-t-il pas non plus un postfix restartou reloadou quelque chose comme ça? Dernière chose: existe-t-il un fichier journal pour voir les mails qui sont arrivés sur postfix?
Basj

@Basj, le fichier journal est /var/log/mail.log.
fiedl

4

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é à "pong@mymailserver.com" vers un script perl que j'ai écrit pour le traiter.

gotit.pl (à titre d'exemple, ne me reprochez pas pour une programmation merde skillz =). Son travail consistait à traiter un e-mail que j'avais envoyé à notre serveur Exchange (où il a été répondu automatiquement via un code VB) pour vérifier qu'Exchange traitait les e-mails en temps opportun. Sinon, le serveur de messagerie enverrait un e-mail d'alerte à nos pagers et rédigerait 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;
    }
}

Oui, et redirigez simplement @ mydomain.tld vers pong et tous les principaux entrants pour mydomain.tld seront canalisés.
Zaar Hai

et pour ceux d'entre nous qui utilisent plusieurs domaines virtuels, n'oubliez pas de le rediriger vers pong @ localhost afin qu'il n'attache pas le nom de domaine par défaut à l'alias
therightstuff

0

J'ai utilisé un "fichier plat" Mailboxà l' ancienne pour recevoir tout le courrier (puis le tailler toutes les quelques heures s'il est volumineux), au lieu d'utiliser les maildir/dossiers modernes , pour traiter le courrier via 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

Après beaucoup de maux de tête, j'ai mis au point cette solution basée sur quelques sources différentes, ce qui a entraîné beaucoup moins d'efforts, les étapes critiques ont été configurées virtual_alias_domainsainsi virtual_alias_mapset m'assurer que le mappage virtuel était au my-alias@localhostlieu de juste 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 de mydestinationvaleurs
  • 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 bob@gmail.com
everyone@your-domain-name bob@gmail.com jim@gmail.com
email_processor@your-domain-name curl_email@localhost
@your-domain-name catchall@whereveryouwant.com
ted@example.net jane@outlook.com
  • sudo postmap /etc/postfix/virtual
  • sudo /etc/init.d/postfix reload
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.