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

Отбросить исходящую почту в ранее недоступные почтовые ящики в exim, используя базу данных mysql

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

Это не полное решение исходной проблемы, потому что я немного упростил, чтобы выяснить, что происходит. Но на основе этого будет легко расширить схему базы данных и запрос, чтобы они соответствовали функциональным возможностям, описанным выше.