Laravel - прекратить отправку электронной почты во время выполнения - PullRequest
0 голосов
/ 09 апреля 2020

В моем приложении Laravel 7.5 я отправляю электронное письмо всякий раз, когда создается запись (запускается через события модели). Электронные письма отправляются с использованием драйвера mailgun на производстве.

Однако существует функция импорта, и при использовании импорта я не хочу отправлять тысячи писем. Каков наилучший способ приостановить или отключить Laravel электронную почту во время выполнения только для выполнения текущего запроса / сценария?

Я пробовал несколько вещей.

  • Настройка драйвера почты на log или array
config(['mail.driver' => 'log'])

Работал нормально на локальном / dev (с помощью драйвера smtp), но на производстве не останавливал электронную почту.

  • Прослушивание MessageSending события и возвращение false, чтобы предотвратить электронную почту. Опять же, он работал нормально на локальном компьютере, используя драйвер smtp, но не останавливал электронную почту на производстве, используя драйвер mailgun.

В настоящее время я звоню Mail::fake(), чтобы поменять фасад Почты с фальшивкой. Кажется, работает нормально, но чувствует себя очень хакерским и потенциально не будет работать с другими драйверами и / или сообщениями в очереди.

Есть ли лучший, более чистый способ временной и глобальной приостановки отправки электронной почты? Я не хотел бы останавливать отправку событий, так как они выполняют другую обработку, кроме электронной почты.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

При массовом обновлении или удалении через Eloquent события модели saved, updated, deleting и deleted не будут запускаться для затронутых моделей.

Источник: https://laravel.com/docs/7.x/eloquent#events

0 голосов
/ 09 апреля 2020

Я не проверял эту идею, но вы можете попытаться присвоить sh переменную вашей сессии перед логи импорта c, например:

session()->flash('import_disable_email',true);

// import logic here

И в вашей модели обработки событий проверьте, существует ли ключ сеанса следующим образом:

if(!session('import_disable_email')){ // or !== null
  // send email logic here
}

Конечно, если вы хотите сохранить переменные сеанса в чистоте после сохранения logi c, вы можете удалить эту запись с помощью:

// import logic here

session()->forget('import_disable_email');
...