у нас есть более крупный портал сообщества, который с годами становился все больше и больше, но также есть несколько мертвых аккаунтов. Недавно IP-адрес сервера был занесен в черный список, потому что многие почтовые адреса пользователей больше не доступны (550), и сервер отправлял им информационные бюллетени.
Чтобы избежать этого, я отфильтровываю известные недоступные почтовые ящики в отправляющем php скрипте, но я хочу, чтобы exim взял на себя эту работу, потому что она более универсальна.
Я планирую использовать базу данных mysql для вывода списка недоступных почтовых ящиков. Я хочу использовать простой сценарий, который просматривает файлы журналов и сохраняет адреса электронной почты недоступных почтовых ящиков в базе данных.
Я не уверен, что некоторые провайдеры только делают вид, что почтовые ящики недоступны, потому что сервер был в черном списке. Но однажды 40% писем были отклонены с этим ответом, и я не могу представить, чтобы так много пользователей удалили свои почтовые аккаунты. Кроме того, я должен принять во внимание, что удаленные учетные записи могут быть (повторно) созданы в какой-то момент. Так что вместе с адресом я буду хранить метку времени, то есть, скажем, 4 недели в будущем. В течение этого времени все письма на адрес должны быть сброшены. Если первое письмо по прошествии этих 4 недель может быть доставлено, все в порядке. В противном случае период должен быть продлен (экспоненциальная отсрочка или около того).
Я могу покрыть все это сценарием, и я даже уже знаю, как будет выглядеть sql-запрос, который дает список заблокированных адресов:
SELECT blocked FROM maildrop WHERE name=${localpart}@${domain} and timestamp<UNIX_TIMESTAMP()
Но вопрос в том, как мне правильно интегрировать это в конфигурацию exim? Сначала я подумал, что могу использовать виртуальные псевдонимы и перенаправлять почту пользователю devnull @ localhost, чьи письма отправляются в / dev / null.
Я тестировал его, используя следующую конфигурацию
mysql_sys_aliases:
debug_print = "R: mysql_sys_aliases for $local_part@$domain"
driver = redirect
allow_fail
allow_defer
data = ${lookup mysql{SELECT login FROM aliases WHERE alias='${local_part}@${domain}'}}
Кстати: я также тестировал mysql_aliases вместо mysql_sys_aliases
и следующую запись в базе данных: alias: mail@externaldomain.com | логин: devnull @ localhost
Но безуспешно. Я все еще получал письма на externaldomain.com
Затем я также нашел этот пост, где используются acls, но я тоже не смог заставить его работать. Также я не уверен, работает ли это для почты, которая отправляется системой напрямую (не через внешний SMTP) https://serverfault.com/a/577007/239968
Как бы вы это решили?
после долгого дня попыток и ошибок я только что узнал, как это работает. Удивительно просто в ретроспективе.
В Debian убедитесь, что вы установили пакеты exim4-daemon-heavy для поддержки mysql. Я также предполагаю, что используется разделенная конфигурация (все пути указаны относительно /etc/exim4/conf.d/).
Затем создайте базу данных с хотя бы одним столбцом, содержащим адреса электронной почты из черного списка. Эта колонка должна быть проиндексирована.
Создайте файл main / 50_exim4-config_failmail и поместите в него учетные данные mysql:
hide mysql_servers = MYSQL_HOST/MYSQL_DB/MYSQL_USER/MYSQL_PASS
Кроме того, создайте router / 050_exim4-config_failmail_router и добавьте:
failmail:
driver = redirect
data = ${lookup mysql { SELECT '/dev/null' FROM dropmail WHERE email='${local_part}@${domain}'} {$value} }
file_transport = address_file
Очень важно, чтобы имя файла начиналось с этого 050, потому что он должен быть загружен раньше других маршрутизаторов. В противном случае правила игнорируются. Мне потребовалось несколько часов, чтобы понять, насколько важно называть файл «50_exim4-config ...». В этом случае его правила обрабатываются после набора из 400 правил, и вся исходящая почта уже отправлена.
Это не полное решение исходной проблемы, потому что я немного упростил, чтобы выяснить, что происходит. Но на основе этого будет легко расширить схему базы данных и запрос, чтобы они соответствовали функциональным возможностям, описанным выше.