Як налаштувати постфікс для передачі всього вхідного електронного листа до сценарію?


24

Використовуючи постфікс, я хотів би, щоб вся вхідна пошта на будь-яку адресу (включаючи таку, яка не відображається для місцевих користувачів) передавалася на сценарій. Я спробував конфігурація 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

Повідомлення переходять до веб-програми. Тож після сценарію: база даних, інша обробка, інші речі, але не звичайні речі для пошти. Ключове питання полягає у тому, щоб невідомі користувачі не відскакували - це поза звичайним сценарієм вірусів / спаму, де ви відмовлятиметесь від невідомих користувачів.
користувач67641

@ user67641 Привіт мені потрібно ввести пошту в постфікс в моєму сценарії або додавши ще кілька рядків у
master.cf

Відповіді:


32

Гаразд, я щойно працював над цим - хоч і волосінішим, ніж я думав, що це буде. Я кинув maildir_commandчастину і пішов з transport_maps. Ключовим завданням є 5 дій:

  1. Налаштуйте db-файл для обробки псевдонімів (і додайте псевдонім вилученого файлу)
  2. Налаштуйте db-файл, щоб зіставити 'транспорт' для відповідного домену на спеціальний обробник.
  3. Скомпілюйте файли db у форматі db Берклі, який потрібен постфікс.
  4. Налаштуйте обробник для /etc/postfix/master.cfпередачі пошти до сценарію.
  5. Встановіть, /etc/postfix/main.cfщоб використовувати транспорт db для transport_maps, а псевдонім db для 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потрібно скласти у файли db berkeley:

$ 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

І ... добре йти! Шиш.


1
надзвичайно корисна відповідь
merveotesi

1
Віртуальні псевдонімові карти не потрібні. Ви можете виконати те саме, що і з цим relay_domains(у цьому випадку транспортний файл може фільтруватися на основі фактичної адреси до:).
Brilliand

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

(4) повинен бути в одному рядку, чи правильно це? Крім того, вона не вимагає postfix restartабо reloadабо що - щось подібне? Останнє: чи є файл журналу, щоб побачити пошти, які надійшли на постфікс?
Бась

@Basj, файл журналу є /var/log/mail.log.
fiedl

4

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

pong: "| /usr/local/bin/gotit.pl"

Це надіслало трафік, призначений для "pong@mymailserver.com", до сценарію Perl, який я написав для його обробки.

gotit.pl (як приклад, не вибирайте мене для хитрого програмування skillz =). Його завдання полягала в тому, щоб обробляти електронний лист, який я надсилав на наш сервер 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, і все вхідне основне для 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
  • Додайте до списку mydestinationзначень mail.your-domain-name
  • Додавати
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.