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

Как заставить postfix доставлять через команду

Я установил сервер postfix, который будет получать несколько писем и доставлять их в OpenERP. В настоящее время он работает, но я хотел бы улучшить общую схему, чтобы postfix доставлял (например, Delivered-To) на псевдоним электронной почты OpenERP.

Подробнее об установке

Большая схема такова:

  1. Установлены postfix-pgsql. В моем main.cf файл у меня что-то вроде:

    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases
    myorigin = /etc/mailname
    mydestination = localhost
    
    virtual_alias_domains = mydomain.com
    virtual_alias_maps = pgsql:/etc/postfix/pgsql-aliases.cf
    
  2. Запрос в pgsql-aliases.cf

    query = SELECT 'oerp@localhost'
            FROM mail_alias a, ir_config_parameter d
            WHERE (d.key = 'mail.catchall.domain')
                  AND (d.value = '%d')
                  AND (a.alias_name = '%u');
    
  3. Тогда у меня есть псевдоним "oerp" в /etc/aliases:

    oerp: "| openerp_mailgate ...args... "
    

Проблема

Эта установка работает довольно хорошо. Доставляются письма и т. Д. Но, кроме того, у меня есть неподконтрольный мне MTA (мой постфикс может ретранслировать его для посторонних), который ретранслирует электронные письма, приходящие на «mydomain.com», на мой постфикс.

В этом MTA есть несколько правил. Например, если вы отправите электронное письмо на адрес «contact@external-domain.com», MTA повторно доставит письмо на «contact@mydomain.com» и «boss@external-domain.com». Это повторная доставка не коснется исходных заголовков.

"Contact@mydomain.com" будет передан моему постфиксу и, в конечном итоге, будет передан сценарию mailgate. Но заголовок «Delivered-To» будет изменен на «oerp @ localhost».

OpenERP ищет заголовок «Delivered-To» (среди прочего) сообщения, чтобы знать, что с ним делать. Но в этом случае "Delivered-To" всегда будет одним и тем же, и поэтому мы не можем использовать его ни для чего важного.

Я хотел бы изменить схему, чтобы postfix доставлял электронное письмо в мой сценарий mailgate, не прибегая к псевдониму «oerp @ localhost», а «Delivered-To» оставался неизменным (в этом примере ожидается, что это будет «contact @ mydomain. com ").

Любые идеи? Я играл с master.cf но ничего не добился.

Краткое изложение найденного мной решения:

  1. Удалите псевдоним, который соответствует 'oerp @ localhost' сценарию.

  2. Поместите скрипт в виде трубы в master.cf.

  3. Создайте транспортную карту, которая соответствует вашему домену OpenERP, которая будет доставлена ​​в сценарий, ранее определенный в master.cf.

  4. Использовать pg_aliases.cf для карты виртуального почтового ящика вместо псевдонима. Затем удалите псевдоним oerp в /etc/aliases.

Длинный ответ

Предыдущее решение просто давало один и тот же псевдоним для каждого совпадения, что приводило к ненадежности «Доставлено». Теперь я переделал все решение и вместо этого использовал виртуальный почтовый ящик, например:

virtual_mailbox_domains = mydomain.com
virtual_mailbox_maps = pgsql:/etc/postfix/pg-aliases.cf

Это дает другой взгляд на проблему, и ИМО более верен: вместо того, чтобы давать один и тот же "псевдоним" почтового ящика каждому сообщению, просто найти положительный виртуальный почтовый ящик.

В pg-aliases.cf был изменен (хотя в этом нет необходимости, я считаю его более удобным для ведения журнала), чтобы:

query = SELECT '%u@%d'
      FROM mail_alias a, ir_config_parameter d
      WHERE (d.key = 'mail.catchall.domain')
            AND (d.value = '%d')
            AND (a.alias_name = '%u');

Теперь вам нужно определить транспорт, который фактически доставляет входящие сообщения электронной почты в сценарий mailgate. Это делается в два этапа:

Сначала настройте сценарий mailgate в master.cf файл, например:

openerp   unix  -       n       n       -       1       pipe
   flags=DFR user=openerp argv=/path/to/mailgate.py -d dbname ... etc ..

Заметь 1 как предел. Это сделано для того, чтобы одновременный доступ к серверу OpenERP был невозможен, иначе сообщения приходили на несколько @mydomain.com адрес может удвоиться в БД из-за транзакционной изоляции.

Напишите простой /etc/postfix/transports файл:

mydomain.com  openerp

И проинструктировать main.cf чтобы прочитать этот транспортный файл:

transport_maps = hash:/etc/postfix/transports

Вы можете забыть об использовании транспортной карты virtual_transport=openerp если у вас есть только этот виртуальный домен. Однако вам может быть полезно иметь другие внутренние домены для внутренних сообщений и т. Д.

Одно альтернативное решение: вы можете отключить Delivery-To заголовок, когда передается команда с помощью параметра prepend_delivered_header. Когда заголовок Delivery-To отсутствовал, OpenERP проверяет To заголовок.

Добавьте эту строку в main.cf

prepend_delivered_header = file, forwarding

Это будет отключено Delivery-To добавляется при доставке через команду.

В документы постфикса сказано ниже о prepend_delivered_header

prepend_delivered_header (по умолчанию: команда, файл, пересылка)

Контексты доставки сообщений, в которых агент доставки Postfix local (8) добавляет в заголовок сообщения Delivered-To: адрес, на который было доставлено письмо. Эта информация используется для обнаружения петель при доставке почты.

По умолчанию, агент локальной доставки Postfix добавляет заголовок Delivered-To: при пересылке почты и при доставке в файл (почтовый ящик) и команду. Не рекомендуется отключать заголовок Delivered-To: при пересылке почты.

Укажите ноль или более пересылки, файла или команды.

После многих головных болей я собрал это решение Основываясь на нескольких разных источниках, которые потребовали гораздо меньше усилий, критически важными шагами была настройка 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