Не отправлять email уведомления на определенные адреса

День добрый!
Столкнулся с задачей.
При работе с маркетплейсами и их заказами в качестве аккаунта используются специально созданные аккаунты покупателей под них. Соответственно в качестве адреса электронной почты указаны адреса типа кодовое_имя@домен.сайта . Соответственно в почту сыпятся в большом количестве сообшения о недоставленных письмах на эти адреса.
Стал копать, где отключить отправку писем на такие адреса. В итоге дошел до
/app/Tygh/Mailer/Mailer.php
в методе send класса есть код

        $body = $message->getBody();
        $from = $message->getFrom();
        $to = $message->getTo();

        if (empty($body) || empty($from) || empty($to)) {
            return false;
        }

        /**
         * Allows to change the message before sending it.
         *
         * @param Mailer        $this       Instance of mailer
         * @param ITransport    $transport  Instance of transport for send mail
         * @param Message       $message    Instance of message
         * @param string        $area       Current working area (A-admin|C-customer)
         * @param string        $lang_code  Language code
         */
        fn_set_hook('mailer_send_pre', $this, $transport, $message, $area, $lang_code);
        $result = $transport->sendMessage($message);

как я понимаю через хук mailer_send_pre я никак не смогу предотвратить отправку
пока справляюсь тем, что после

        $body = $message->getBody();
        $from = $message->getFrom();
        $to = $message->getTo();

вставил проверку прямо в файл, если $to соответствует моим условиям, то return false

если бы хук был сразу за этими строками, то можно было бы обнулить $to и тогда в следующем условии произошел бы выход. Но нет.
Возможно, кому-нибудь известен более адекватный способ прервать отправку писем в подобных случаях и более адекватным способом?

Чтобы не отправлять email-уведомления на определенные адреса в системе, вы можете использовать несколько подходов, в зависимости от того, как устроена ваша система.

Вот более простое и понятное объяснение того, как можно решить вашу задачу.

1. Использование хука mailer_send_pre

Хук mailer_send_pre вызывается перед отправкой письма, и это место, где можно добавить логику для блокировки отправки уведомлений на определенные адреса.

Как это сделать:

  1. В файле, где вызывается хук mailer_send_pre, вам нужно добавить проверку на адрес получателя. Если адрес попадает в список заблокированных, возвращаете false, чтобы остановить отправку.
fn_set_hook('mailer_send_pre', $this, $transport, $message, $area, $lang_code);

// Получаем адреса получателей
$to = $message->getTo();

// Если один из адресов — это тот, который нужно заблокировать
if (is_array($to) && in_array('кодовое_имя@домен.сайт', $to)) {
    return false;  // Прерываем отправку
}

Что делает этот код:

  • Проверяет, отправляется ли письмо на адрес, который нужно заблокировать (в примере это кодовое_имя@домен.сайт).
  • Если да, то возвращает false, что отменяет отправку письма.

2. Кастомный класс Mailer

Другой способ — это создать кастомный класс для отправки писем, который будет проверять получателя перед отправкой.

Пример:

class CustomMailer extends Tygh_Mailer {
    public function send(Message $message) {
        // Получаем адрес получателя
        $to = $message->getTo();

        // Если адрес получателя — это тот, который нужно заблокировать
        if (is_array($to) && in_array('кодовое_имя@домен.сайт', $to)) {
            return false;  // Прерываем отправку
        }

        // Отправляем письмо через родительский метод
        return parent::send($message);
    }
}

Этот подход подходит, если вы хотите централизованно контролировать отправку всех писем через кастомный класс, который проверяет адреса получателей.

3. Модификация транспортного слоя (ITransport)

Вы также можете создать собственный транспорт, который будет обрабатывать отправку писем и проверять адреса перед отправкой.

Пример:

class CustomTransport implements ITransport {
    public function sendMessage(Message $message) {
        $to = $message->getTo();
        
        // Проверка на адреса, которые нужно исключить
        if (is_array($to) && in_array('кодовое_имя@домен.сайт', $to)) {
            return false;  // Останавливаем отправку
        }
        
        // Отправляем письмо через оригинальный транспорт
        return $this->originalTransport->sendMessage($message);
    }
}

4. Проверка на уровне конфигурации

Некоторые системы могут позволять настраивать фильтры или исключения для отправки email-уведомлений на уровне конфигурации (например, через панель администратора). Если такая настройка есть в вашей системе, вы можете просто указать, что не хотите отправлять письма на определенные адреса.

Рекомендации:

  • Хук mailer_send_pre — это самый простой и наименее инвазивный способ. Он не требует создания новых классов и хорошо работает для большинства задач.
  • Кастомный класс Mailer или Transport — это более сложный, но гибкий способ, который позволяет вам полностью контролировать процесс отправки писем в вашей системе.

С уважением ИИ :upside_down_face:

Ну так в том то и дело, первый пункт я и сделал, но это правка файла /app/Tygh/Mailer/Mailer.php
а я хотел обойтись без правки ядра…

Он выдал мне целую поэму ))

Тс-с-с

Вот походу, ИИ уже стал умнее разработчиков, так как включает вот эту проверку, что это массив, перед тем, как искать индекс, или проверяет на существование индекса массива, перед тем как проверять на соответствие значения. В коде ядра зачастую таких проверок нет, отсюда и сыпятся в лог массовые варнинги: “ты хочешь проверить на значение то, чего нет”.

2 лайка
Спойлер

Так он учится, растет, а кто-то нет )

2 лайка

Иногда нужно ломать чтобы заработало :rofl:. А то во многих местах хуки не там стоят. Например в fn_get_products хук get_products. Параметр sorting. Кто поймет тот поймет.

2 лайка

По идее нужно сделать класс валидации. Чтобы проверять адреса почтовых ящиков. Если не правильный то можно просто отправлять письма на почту админа. Заранее поменяв message.

1 лайк