Как настроить postfix для передачи всей входящей электронной почты в скрипт?


24

Используя postfix, я хотел бы, чтобы вся входящая почта, на любой адрес (включая те, которые не отображаются на локальных пользователей), передавалась в сценарий. Я попытался настроить mailbox_commandв /etc/postfix/main.cf:

mailbox_command = /path/to/myscript.py

Это прекрасно работает, если пользователь является локальным, но не работает для «неизвестных» пользователей, у которых нет псевдонимов. Я попытался установить luser_relayдля локального пользователя, но это упраздняет mailbox_command, и поэтому команда не запускается. Я попытался установить local_recipient_maps=(пустая строка), но сообщение все еще отклонено (неизвестный пользователь).

Есть ли волшебный вызов, который я могу использовать, чтобы заставить всех известных и неизвестных пользователей перейти к сценарию?

/etc/postfix/main.cfДалее следует полная версия - это Ubuntu 10.04 по умолчанию, за исключением mailbox_commandстроки:

# 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

После сценария, что тогда? Это похоже на то, что делают антивирусные сканеры и спам-фильтры. Может быть, вы найдете руководство по настройке одного из них и его настройке для своего скрипта?
DerfK

Сообщения отправляются в веб-приложение. Итак, после сценария: база данных, другая обработка, другие вещи, но не обычные почтовые вещи. Ключевой вопрос заключается в том, чтобы заставить неизвестных пользователей не подпрыгивать - это выходит за рамки обычного сценария вируса / спама, в котором вы отскакиваете не отображенных пользователей.
user67641

@ user67641 Привет, мне нужно вставить сообщение в postfix в моем скрипте или добавить еще несколько строк в master.cf
merveotesi

Ответы:


32

Хорошо, я только что получил это работает - хотя более привлекательный, чем я думал, что будет. Я бросил maildir_commandчасть и пошел с transport_maps. Ключ должен сделать 5 вещей:

  1. Настройте файл БД для обработки псевдонимов (и добавьте псевдоним для всех)
  2. Настройте файл базы данных, чтобы сопоставить «транспорт» для рассматриваемого домена со специальным обработчиком.
  3. Скомпилируйте файлы БД в формат Беркли БД, который хочет Postfix.
  4. Настройте обработчик /etc/postfix/master.cfдля передачи почты в сценарий.
  5. Установите /etc/postfix/main.cfдля использования транспортную базу данных для transport_mapsи псевдоним для базы данных virtual_alias-maps.

(1) Создать, /etc/postfix/virtual_aliasesчтобы добавить универсальный псевдоним - localuserдолжен быть существующий локальный пользователь:

@mydomain.tld   localuser@mydomain.tld

(2) Создать, /etc/postfix/transportчтобы добавить транспортное отображение. «mytransportname» может быть любым, что вы хотите; он используется ниже в master.cf:

mydomain.tld    mytransportname:

(3) Далее, оба transportи virtual_aliasesдолжны быть скомпилированы в файлы Беркли БД:

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

(4) Добавьте транспорт к /etc/postfix/master.cf:

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

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

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

И ... хорошо идти! Sheesh.


1
чрезвычайно полезный ответ
merveotesi

1
Виртуальные карты псевдонимов не нужны. Вы можете выполнить то же самое с помощью relay_domains(в этом случае транспортный файл может фильтроваться на основе фактического адреса To:).
Brilliand

Я обнаружил, что вы можете направить всю виртуальную почту в скрипт с помощью virtual_transport = mailcaptcha:in main.cfи mailcaptcha unix - n n - - pipe flags=FR user=vmail argv=/usr/bin/perl /usr/local/mail-captcha/verify.pl ${sender} ${recipient}in master.cf. См. Postfix.org/transport.5.html и postfix.org/VIRTUAL_README.html .
Хлоя

(4) должно быть в одной строке, верно? Также не требуется postfix restartили reloadили что-то подобное? И последнее: есть ли файл журнала для просмотра писем, пришедших на postfix?
Basj

@Basj, файл журнала есть /var/log/mail.log.
Фидл

4

Единственный раз, когда я использовал что-то подобное, было для почтового ящика конкретного пользователя. Все, что требовалось, - это псевдоним этого пользователя к каналу и процесс в псевдонимах:

Понг: "| /usr/local/bin/gotit.pl"

Это отправило трафик, предназначенный для «pong@mymailserver.com», в сценарий perl, который я написал для его обработки.

gotit.pl (в качестве примера, не выбирайте меня из-за дерьмового навыка программированияz =). Его работа заключалась в том, чтобы обработать письмо, которое я отправил на наш сервер Exchange (на который он автоматически отвечал с помощью некоторого кода VB), чтобы убедиться, что Exchange обрабатывает электронную почту своевременно. Если нет, почтовый сервер отправит оповещение по электронной почте нашим пейджерам и напишет файл блокировки, чтобы мы не получали спам постоянно.

#! /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;
    }
}

Да, и просто перенаправьте @ mydomain.tld в pong, и все входящие main для mydomain.tld будут переданы по конвейеру.
Заар Хай

и для тех из нас, кто использует несколько виртуальных доменов, не забудьте перенаправить его на pong @ localhost, чтобы он не прикреплял имя домена по умолчанию к псевдониму
therightstuff

0

Я использовал «плоский файл» старого стиля, Mailboxчтобы получать всю почту (а затем сокращать ее каждые несколько часов, если она большая), вместо использования современных maildir/папок для обработки почты с помощью сценариев. Вы можете запустить logrotate поверх файла, я полагаю, чтобы он был управляемым.

Таким образом, вы можете просто скопировать всю почту в почтовый ящик как локальный пользователь.


0

После многих головных болей я собрал это решение на основе нескольких различных источников, что привело к гораздо меньшим усилиям, критическим шагам были настройка, virtual_alias_domainsа также virtual_alias_mapsи обеспечение того, чтобы виртуальное сопоставление было my-alias@localhostвместо простого my-alias. В моем примере псевдоним команды состоит в том, чтобы направить электронное письмо к конечной точке API веб-сайта, но с такой же легкостью это можно передать во что-то другое.

Вот шаги, которые вам нужно предпринять:

  • Настройте записи A и MX для своего домена, запись A @, указывающая на IP-адрес сервера, на который вы будете получать электронные письма, и MX с именем хоста @ и значением 10 mail.your-domain-name
  • sudo apt-get install postfix
  • Выберите «Интернет-сайт» и введите ваше доменное имя (полностью)
  • sudo vi /etc/postfix/main.cf
  • Добавьте mail.your-domain-name в список mydestinationзначений
  • Append
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_alias_maps = hash:/etc/postfix/virtual

в конец файла

  • 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

(поля #domain подавляют предупреждения)

  • 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.