Назад | Перейти на главную страницу

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

Я хочу запустить промежуточную копию производственного сервера в локальной среде. Система запускает приложение PHP, которое отправляет электронное письмо клиентам в различных сценариях, и я хочу быть уверенным, что электронная почта никогда не отправляется из промежуточной среды.

Я могу настроить код так, чтобы он использовал фиктивный отправитель электронной почты, но я бы хотел запустить тот же код, что и в производственной среде. Я могу использовать другой MTA (Postfix - это как раз то, что мы используем в производстве), но я бы хотел что-то, что легко настроить под Debian / Ubuntu :)

Итак, я хотел бы настроить локальную установку Postfix для хранения всей электронной почты в (одном или нескольких) файлах вместо их пересылки. На самом деле, мне все равно, как они хранятся, если есть возможность проверить отправленное электронное письмо. Даже параметр настройки, который указывает postfix сохранять электронную почту в очереди почты, будет работать (я могу очистить очередь, когда я перезагружаю промежуточный сервер копией из производства).

Я знаю, что это возможно, я просто не нашел в Интернете хорошего решения для довольно распространенной потребности.

Спасибо!

Я создал новый транспорт с помощью команды конвейера, которая записывает электронную почту в файл.

В принципе:

  1. Создайте пользователя, которому будет принадлежать электронная почта (или использовать уже существующий). Я позвонил своему email
  2. mkdir /home/email/bin
  3. Поместите следующий скрипт в /home/email/bin/mail_eater (здесь используется PHP, но вы можете написать свою собственную версию на любом языке, который вам нравится, он просто добавляет stdin в файл):

    #!/usr/bin/php
    <?php
    $fd = fopen("php://stdin", "r");
    $email = "";
    while (!feof($fd)) {
        $email .= fread($fd, 1024);
    }
    fclose($fd);
    $fh = fopen('/home/email/email.txt','a');
    fwrite($fh, $email."\n-------------------------------------------------------\n\n");
    fclose($fh);
    
  4. chmod a+x /home/email/bin/mail_eater
  5. touch /home/email/email.txt
  6. chmod a+r /home/email/email.txt
  7. Создайте новый транспорт, используя этот файл, добавив следующую строку в master.cf:

    file_route unix -    n    n    -    -    pipe user=email  argv=/home/email/bin/mail_eater
    
  8. Используйте это как транспорт по умолчанию в main.cf:

    default_transport = file_route
    

Там :)

Вы можете поместить эти домены в $mydestination в main.cf, поэтому postfix доставит его локально.

Вы можете настроить разных локальных пользователей, если хотите, или вы можете настроить локальный адрес для приема всей почты домена, чтобы доставлять электронные письма только в одну учетную запись, подробнее здесь: http://www.postfix.org/ADDRESS_REWRITING_README.html#luser_relay

Для всех доменов:

mydestination = pcre:/etc/postfix/mydestinations

и /etc/postfix/mydestinations должен содержать

/.*/    ACCEPT

Я не могу сейчас протестировать, но он должен работать.

попробуйте (в main.cf):

defer_transports = smtp

тогда вы можете увидеть очередь postqueue -p и смотреть контент с postcat

В зависимости от вашего дистрибутива вы можете посмотреть "nullmailer". Это ретранслятор MTA, который ретранслирует на другой SMTP в вашей сети или удаленно. Это вполне может быть неверный SMTP, и в этом случае он, вероятно, только поместит его в очередь в папке на машине.

В debian и ubuntu это доступно в качестве замены MTA для вашей системы.

Это скопировано и немного изменено из моего блога http://blog.malowa.de/2011/04/postfix-as-spam-trap-server.html:

Вам даже не нужно настраивать Postfix для работы в качестве рассылки нулевых сообщений. Postfix поставляется с изящным инструментом под названием smtp-sink что делает свое дело. smtp-приемник в основном предназначен для работы в качестве инструмента тестирования для клиентов SMTP, которым нужен сервер для игры. Таким образом, вы можете настроить его для записи всего разговора или даже для сохранения каждого полученного письма в файл. Последнее необходимо для нулевого рассылки.

Нет файла конфигурации для настройки smtp-приемника. Все делается с помощью параметров командной строки.

smtp-sink -c -d "%Y%m%d%H/%M." -f . -u postfix -R /tmp/ -B "550 5.3.0 The recipient does not like your mail. Don't try again." -h spamtrap.example.com 25 1024

Рассмотрим подробнее каждый параметр.

-u postfix
Runs the program under the user "postfix"
-R /tmp/
Sets the output directory to /tmp/. In this directory the mails will be stored. If you have a high spam volume (hundreds of Spam per minute) it is recommended to write the mails to a ramdisk
-d "%Y%m%d%H/%M."
Writes the mail to a directory of the format "YearMonthDayHour" and in this directory the files are name "Month.RandomID". Note that the dates are in UTC
-c
Write statistics about connection counts and message counts to stdout while running
-f .
Reject the mail after END-OF-DATA. But the mail will be saved. Cool, isn't it?!
-B "550 5.3.0 The recipient does not like your mail. Don't try again"
This is the rejection message after END-OF-DATA.
-h spamtrap.example.com
Announce the hostname spamtrap.example.com
25
The port to listen on. Can be prepended with an IP or host if you want to bind on a special interface.
1024
The backlog count of connections that can wait in the TCP/IP stack before they get a free slot for sending mail.

Вы можете найти дополнительную информацию на странице руководства smtp-раковины, но они важны для запуска спам-ловушки для всех. В этой конфигурации программа принимает любую почту любого размера от любого отправителя любому получателю с IPv4 и IPv6. Единственное ограничение состоит в том, что возможно только 256 одновременных подключений с 1024 подключениями в очереди, и программа помечена как экспериментальная. Поэтому не используйте smtp-сток в производственной среде.

Параметр -B действителен только в более новых версиях Postfix. В 2.7.1 его нет. В 2.8.2 он присутствует. Где-то посередине это было введено.