Как настроить postfix для передачи всей входящей электронной почты в скрипт?
Используя 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
3 ответа
Хорошо, я только что получил это работает - хотя более привлекательный, чем я думал, что будет. Я бросил maildir_command
часть, и пошел с transport_maps
, Ключ должен сделать 5 вещей:
- Настройте файл БД для обработки псевдонимов (и добавьте псевдоним для всех)
- Настройте файл базы данных, чтобы сопоставить "транспорт" для рассматриваемого домена со специальным обработчиком.
- Скомпилируйте файлы БД в формат Беркли БД, который хочет Postfix.
- Настройте обработчик в
/etc/postfix/master.cf
направить почту в скрипт. - Задавать
/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.
Единственный раз, когда я использовал что-то подобное, было для почтового ящика конкретного пользователя. Все, что требовалось, - это псевдоним этого пользователя к каналу и процесс в псевдонимах:
Понг: "| /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;
}
}
После многих головных болей я собрал это решение на основе пары разных источников, что привело к гораздо меньшим усилиям, критические шаги были настройка 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
ценности - присоединять
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
Я использовал старый стиль "плоский файл" Mailbox
получать всю почту (а затем обрезать ее каждые несколько часов, если она большая) вместо использования современных maildir/
папки, для обработки почты через скрипты. Вы можете запустить logrotate поверх файла, я полагаю, чтобы он был управляемым.
Таким образом, вы можете просто скопировать всю почту в почтовый ящик как локальный пользователь.