Вопрос или проблема
Я занимаюсь разработкой веб-приложения, которое отправляет электронные письма пользователям. Обычно я использовал Argosoft Mail Server (бесплатное ПО) в среде Windows в качестве SMTP-сервера, на котором я включил пересылку, но отключил фактическую доставку. Это позволяет мне настраивать мое веб-приложение на локальный сервер и проверять все отправленные электронные письма, просматривая очередь исходящей почты. Кроме того, чтобы быть полностью уверенным, я использовал несуществующий DNS-сервер, чтобы убедиться, что если я когда-либо случайно включу доставку, сервер все равно не сможет определить внешние адреса и доставить почту.
Теперь, когда я разрабатываю на машине с OSX, я ищу похожее решение. По умолчанию в OSX установлен Postfix, поэтому я решил использовать его и настроить аналогично. Однако я не могу нигде найти опцию, чтобы отключить всю исходящую почту. По сути, я хочу настроить Postfix как открытый реле-сервер, но отключить доставку всех электронных писем. Затем я смогу просмотреть очередь исходящей почты и проверить, соответствуют ли электронные письма ожидаемым.
Есть ли способ легко это сделать? Или я могу использовать лучшее решение?
Поставить всю исходящую почту на паузу
-
В
main.cf
добавьте следующееcheck_recipient_access
как первый вариантsmtp_sender_restrictions
2smtpd_sender_restrictions = check_recipient_access regexp:/etc/postfix/onhold ... ...
-
Создайте
/etc/postfix/onhold
со следующим содержимым/example\.com$/ DUNNO /^/ HOLD
Все будет помещено в очередь ожидания, за исключением электронной почты для example.com.
На основе сайта Postfix измените
queue_run_delay = 3600
300 — это значение по умолчанию, что равно 5 минутам. Изменив его на 3600, вы будете пытаться доставить почту раз в час. Вы можете попробовать установить 86400 (24 часа). Я думаю, этого должно быть достаточно для тестирования и проверки содержимого электронной почты.
Для сайта с низким трафиком я использовал следующий однострочник на Bash:
while [ true ]; do mailq | egrep '^[A-Z0-9]+[* ] ' | cut -d' ' -f1 | xargs -rl postsuper -h ; sleep 1; done
По сути, мы ищем и извлекаем (новые) не удерживаемые и активные ID и ставим их на паузу каждую секунду. Вам не нужно прикасаться к конфигурации Postfix.
Я исследовал похожий вопрос, похоже, что команды postsuper -h ALL и postsuper -H ALL должны работать. http://www.postfix.org/postsuper.1.html
Ответ или решение
Остановка исходящей доставки в Postfix при приеме всех входящих писем
При разработке веб-приложения, которое отправляет электронные письма пользователям, возникает необходимость тестирования и валидации отправляемых сообщений без их фактической доставки в Интернет. Именно поэтому вы хотите настроить Postfix в вашей среде macOS аналогично тому, как вы это делали с Argosoft Mail Server в Windows. Рассмотрим, как можно настроить Postfix на прием всех входящих писем при остановке всех исходящих.
Конфигурация Postfix для остановки исходящих писем
Шаг 1: Изменение конфигурационных файлов
Первым шагом будет редактирование файла конфигурации main.cf
, в котором необходимо добавить параметры для проверки адресов отправителей. Для этого выполните следующие действия:
-
Откройте терминал и выполните команду для редактирования файла
main.cf
.sudo nano /etc/postfix/main.cf
-
Найдите строку
smtpd_sender_restrictions
и добавьте в начале следующую опцию:smtp_sender_restrictions = check_recipient_access regexp:/etc/postfix/onhold ...
Шаг 2: Создание файла onhold
Теперь нужно создать файл /etc/postfix/onhold
, в котором будут определены правила для всех отправителей.
sudo nano /etc/postfix/onhold
Добавьте в него следующий контент:
/example\.com$/ DUNNO
/^/ HOLD
Эти правила позволяют отправлять письма только для домена example.com
, а остальные сообщения переводятся в статус "HOLD", что означает, что они находятся в удержании и не будут доставлены.
Шаг 3: Настройка временных интервалов для обработки очереди
Для обеспечения удобства тестирования можно увеличить задержку между попытками обработки очереди. Для этого измените параметр queue_run_delay
в main.cf
:
queue_run_delay = 3600
Это значение устанавливает интервал в 1 час (3600 секунд) между обработками очереди, что позволит вам достаточно времени для проверки содержимого писем. При необходимости, вы можете установить значение, равное 86400 (24 часа).
Альтернативные методы управления очередью
Если вы предпочитаете более простой подход без изменения конфигурации, вы можете использовать следующий Bash-скрипт для контроля за очередью:
while [ true ]; do mailq | egrep '^[A-Z0-9]+[* ] ' | cut -d' ' -f1 | xargs -rl postsuper -h ; sleep 1; done
Этот скрипт будет каждую секунду проверять очередь и переводить новые и активные письма в статус "HOLD".
Заключение
Конфигурация Postfix для остановки исходящих сообщений и приема всех входящих является вполне осуществимой задачей. Она позволяет вам тестировать вашу веб-приложение эффективно, избегая ненужной отправки писем, что актуально, когда вы работаете в локальном окружении. С помощью вышеописанных шагов вы сможете успешно настроить вашу систему для удобной работы и тестирования.
Эта настройка не только повысит вашу продуктивность, но и обеспечит безопасность, предотвращая случайную отправку писем в производственной среде.