В настоящее время я сталкиваюсь с аналогичной проблемой на базе кода Laravel 5.2 с использованием библиотеки бэкпорта уведомлений.
Это пример моего решения, аналогичного предложению Кит Луна.Мы просто расширяем класс Illuminate\Notifications\Channels\MailChannel
и переопределяем метод send()
.
Вам необходимо будет определить конфигурацию SMTP из получателей или объектов уведомлений, поэтому вам потребуетсячтобы отредактировать мой пример при необходимости.
Также предполагается, что ваше приложение использует значение по умолчанию Swift_Mailer
, поэтому YMMV ...
<?php
declare (strict_types = 1);
namespace App\Notifications\Channels;
use Illuminate\Notifications\Channels\MailChannel;
use Illuminate\Notifications\Notification;
class DynamicSmtpMailChannel extends MailChannel
{
/**
* Send the given notification.
*
* @param mixed $notifiable
* @param \Illuminate\Notifications\Notification $notification
* @return void
*/
public function send($notifiable, Notification $notification)
{
//define this method on your model (note $notifiable could be an array or collection of notifiables!)
$customSmtp = $notifiable->getSmtpConfig();
if ($customSmtp) {
$previousSwiftMailer = $this->mailer->getSwiftMailer();
$swiftTransport = new \Swift_SmtpTransport(
$customSmtp->smtp_server,
$customSmtp->smtp_port,
$customSmtp->smtp_encryption
);
$swiftTransport->setUsername($customSmtp->smtp_user);
$swiftTransport->setPassword($customSmtp->smtp_password);
$this->mailer->setSwiftMailer(new \Swift_Mailer($swiftTransport));
}
$result = parent::send($notifiable, $notification);
if (isset($previousSwiftMailer)) {
//restore the previous mailer
$this->mailer->setSwiftMailer($previousSwiftMailer);
}
return $result;
}
}
Также может быть полезно сохранить кратковременный запаснастраиваемые быстрые почтовые программы, так что вы можете повторно использовать их в одном и том же вызове / запросе (подумайте о долго работающих работниках) - как в классе коллекции, где в качестве ключа элемента используется хэш конфигурации smtp.
Наилучшийудачи с ним.
Редактировать: Я, вероятно, должен упомянуть, что вам может понадобиться связать это в контейнере службы.Что-то вроде этого должно быть достаточно:
// in a service provider
public function register()
{
$this->app->bind(
\Illuminate\Notifications\Channels\MailChannel::class
\App\Notifications\Channels\DynamicSmtpMailChannel::class
);
}
Или, в качестве альтернативы, зарегистрируйте его как отдельный канал уведомлений.