Я установил сервер postfix, который будет получать несколько писем и доставлять их в OpenERP. В настоящее время он работает, но я хотел бы улучшить общую схему, чтобы postfix доставлял (например, Delivered-To) на псевдоним электронной почты OpenERP.
Большая схема такова:
Установлены 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
Запрос в 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');
Тогда у меня есть псевдоним "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
но ничего не добился.
Удалите псевдоним, который соответствует 'oerp @ localhost' сценарию.
Поместите скрипт в виде трубы в master.cf
.
Создайте транспортную карту, которая соответствует вашему домену OpenERP, которая будет доставлена в сценарий, ранее определенный в master.cf
.
Использовать 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 веб-сайта, но с тем же успехом он может передать что-то еще.
Вот шаги, которые вам необходимо предпринять:
10 mail.your-domain-name
sudo apt-get install postfix
sudo vi /etc/postfix/main.cf
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