Настройка почты для отладки mail-функций разрабатываемых приложений на Ubuntu

    Здравствуйте!

    Недавно купил новый ноутбук (старый стал совсем старый). Установил на него Ubuntu (почему удалил другую ОС, сначала описал, но потом стёр, чтобы не было флейма и холивара).

    Для того, чтобы работала отправка почты из PHP и всего остального, нужен MTA. Я пользуюсь Synaptic для установки большинства программ, и в нём Postfix отмечен логотипом Ubuntu (что означает, что он является MTA по умолчанию), поэтому, без долгих раздумий, поставил Postfix. При установке с помощью синаптика вылезает окошко конфигурирования Postfix, я выбрал выриант localhost only.

    Когда дошёл до момента тестирования одной функции в PHP приложении, связанной с отправкой почты, случился курьёз. Тестирую с копией живой базы, и, после отправки письма, оно, естественно, было отправлено MTA по назначению, от чего уже отвык под Windows, где использовал Courier Mail Server (кстати, очень маленький и удобный). Конечно, сразу извинился перед человеком, которому ушло письмо.

    В связи с чем возник вопрос: как настроить почту, чтобы она не уходила за пределы localhost, либо уходила на определённый локальный ящик?

    Перерыв сеть, я понял, что самый простой вариант — перенаправить всю входящую почту в специальную очередь, которая называется hold. Почта в этой очереди может находиться сколько угодно; ресурсов, кроме места на диске, не потребляет.

    Настраивается это так:
    В файл /etc/postfix/main.cf добавляется строчка
    header_checks = regexp:/etc/postfix/header_checks
    создаётся файл /etc/postfix/header_checks, в него добавляется такая строчка:
    /^Received:/ HOLD
    после чего выполняется команда
    postmap /etc/postfix/header_checks
    а postfix «освежается» командой
    postfix reload
    Как только изменения приняты постфиксом, вся входящая почта будет попадать в очередь hold, и никуда отправляться не будет.

    Почта в этой очереди может быть просмотрена несколькими путями:
    1. Любой смотрелкой текста, например, встроенной в mc. Все сообщения очереди находятся в каталоге /var/spool/postfix/hold, в отдельных файлах, поэтому можно просмотреть любое сообщение.
    2. С помощью программы pfqueue (я поставил синаптиком).
    pfqueue следует запускать так:
    pfqueue -q 4
    параметр q задаёт номер очереди, у очереди hold номер 4.

    + заголовки сохраняются без изменений
    - pfqueue не показывает тело сообщения (по крайней мере, у меня, сообщение в 1251)

    Второй метод — пересылать всю почту на локальный ящик. Почту с локального ящика удобно просматривать, настроив почтовый клиент (который обычно всегда работает) на POP3 localhost.

    Делается это так:
    с помощью синаптика (или apt-get, кому как удобно) устанавливается POP3 демон dovecot (чтобы работал POP3)
    в файл /etc/postfix/header_checks добавляется строчка
    /^Received:/ REDIRECT your_login@localhost
    (если у вас уже есть строчка с HOLD, нужно её закомментировать, поставив в начале строчки #). Выполняются команды
    postmap /etc/postfix/header_checks
    postfix reload

    Почтовый клиент настраивается на POP3 localhost с логином и паролем учётной записи, которая указана в REDIRECT.

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

    + удобно смотреть почту
    - затираются заголовки To:, они заменяются на адрес в REDIRECT.

    Итак, у каждого варианта есть свои преимущества и недостатки (как и у всего в этой жизни). Хорошо, что можно поменять вариант обработки в любой момент. Если есть какой-то более удобный способ перехвата всей почты в Ubuntu, буду рад узнать о нём в комментариях.
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 23

      +1
      Спасибо! + вам
      Все отлично заработало!!!
        0
        Пожалуйста !
        0
        Я поступил проще. Написал маленький скрипт на perl, который принимает всё, что передаётся на стандартный вход и сохраняет в файл в определенной папке на диске, а в качеств названия выбирает текущую дату и время. вызов этого скрипта вписал в php.ini. Это дало возможность гибко настраивать механизм отладки почты и без необходимости даже не запускать MTA

        PS. Позже выяснилось, что я не изобретал велосипеда. Такой скрипт входит в стандартную поставку denwer Дмитрия Котерова
          0
          это еще раз подтверждает выгоду, которую человек получает зная множество разных языков программирования... (вот я не знаю еще perl, чтоб написать такую простенькую программку....)
          а вы молодец ;)
            0
            этот скрипт настолько прост, что написать его можно на чём угодно от sh до php-cli
            0
            Такой скрипт придётся прописывать везде, где уходит почта. Например, я пишу не только на PHP, поэтому требовалось получить решение, работающее для всей системы.
              0
              В этом хорошо помогает архитектура Linux. В вашем случае тот же самый скрипт нужно просто переименовать в /usr/bin/sendmail и все программы в системе будут направлять почту через него. И уж есовсем простым движением вы можете внутри этого скрипта определить условия при которых данные будут направляться настоящему MTA (если он нужен).
                0
                Про архитектуру согласен. Именно поэтому и используется стандартный MTA. А через /usr/bin/sendmail не все программы посылают почту, некоторые через сокет. Поэтому, чтобы не было никаких вопросов в дальнейшем, не стал использовать замену sendmail в виде скрипта.
                  0
                  может я вас удивлю, однако для того, чтобы такие скрипты могли без изменений работать с сокетами существуют специальные демоны типа inetd (xinetd). Это легко избавляет от необходимости держать в памяти немалого размера MTA.

                  Я отлично понимаю что и как вы делали, но в случае если вам не требуется настоящий MTA для нормальной отправки почты, и вся почта должна быть отладочной, то можно обойтись указанным скриптом и не занимать сервер лишними службами.
                    0
                    Тут дело не в том, какой скрипт прикрутить к inetd, а в том, что проще. При переносе на другую систему всё, что мне нужно сделать - отфорвардить всю почту на локальный ящик. Со скриптом - больше телодвижений. Я бы даже сказал, гораздо больше. Мне кажется, это не стоит 10 Мб памяти, которые отъедает Postfix.

                    Может быть, есть какие-то преимущества ? Я не понял, объясните, пожалуйста.
                      0
                      если ваша задача "_не_ отправлять почту вовне", то способ с полным отсутствием MTA и скриптом, который пишется за 20 минут совершенно ничем не проигрывает вашему способу. И даже не надо плевать на 10 мегабайт памяти.

                      В остальном не вижу чем ваши телодвижения проще и "стандартнее" моих =)

                      Это такие мелочи, право слово, что единственное, что я хочу сказать - есть ещё один простой способ это сделать. Больше я ни на что не претендую.
                        0
                        :-)
                        Не хотел Вам обидеть ! Не принимайте близко к сердцу.

                        Просто мне не хочется изобретать велосипеды, в виде скрипта для решения каждой задачи своим путём, если есть уже проверенное рабочее решение. Тем более, Вы прекрасно понимаете, что это совсем не 20 минут.

                        Если Вы напишете статью, где будет этот скрипт, и описано, как его настроить, и это будет так же просто для любого не-админа, я в начале этой статьи напишу: "UPD: есть лучший способ, пользуйтесь им", с линком конечно, на Вашу статью. И это будет правильно.
            0
            в своё время убил много времени на проблему.
            есть проще решение:
            always_bcc = root@localhost
              0
              Если я правильно понимаю, что такое bcc, исходное мыло всё же будет отправлено, просто копии всех сообщений будут доставляться руту. Или эта опция говорит о чём-то другом ?
              У меня была задача _не_ отправлять почту вовне.
                0
                огромное спасибо, always_bcc это то, что я искал, когда наткнулся на эту статью
                0
                А зачем ставить dovecot? Раз почта перенаправляется локальному пользователю, то можно было б обойтись командой mail в консольке. Или mutt (на любителя:-).
                  0
                  Неохота открывать отдельную консоль - лучше пускай в почтовый клиент идёт. Это удобнее.
                  0
                  Тоже решал эту проблему. Решил чуть проще, но и возможностей меньше. Просто настроил локальный почтовый ящик (mailbox). Для этого устанавливается sendmail из коробки и настраивается любимый почтовик на mailbox /var/mail/[username]. Туда будут сваливаться все письма, направленные локально на пользователя [username], например username@server.loc
                  Недостаток - домен должен резолвится локально и имя пользователя совпадать с вашим. В настройках не ковырялся, но можно и это поправить.
                    0
                    Тоже пробовал с sendmail, но у неё именно описанный недостаток - самый большой. Т.е. дополнительно в DNS ковыряться. Postfix без этого работает ОК. Кстати, как в sendmail сделать глобальный форвардинг - не знаю, не дошёл до этого момента. Удалил после того, как выявилась проблема с DNS.

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

                    Добавил пакет PCRE map support for Postfix (postfix-pcre)

                    В /etc/postfix/main.cf написал
                    virtual_alias_maps = pcre:/etc/postfix/virtual.pcre

                    А в самом файле /etc/postfix/virtual.pcre -
                    /(.+)@(.+)/ мой_логин@localhost

                    Теперь вся почта сыпется в мой локальный ящик, но заголовки не затираются. Спасибище за статью :)
                      0
                      о, сейчас я тоже так сделаю.
                      гигантское спасибо за дополнение !
                      0
                      Ээээм. А я (в Python) тупо использую mock-библиотеку. Наверное, и в PHP что-то подобное есть.
                        0
                        Чёрт возьми, вовремя! Спасибо за статью!

                        Only users with full accounts can post comments. Log in, please.