如何在 Laravel 5.4 中为排队电子邮件设置动态 SMTP 数据?

2024-03-17

在我的应用程序中,每个用户都可以使用自己的 SMTP 服务器。因此必须提供配置。我正在使用 Laravel 通知来发送电子邮件。如果我不使用队列(这意味着同步),则没有问题。

我做了一个自定义的可通知特征:

        config([
            'mail.host' => $setting->smtp_host,
            'mail.port' => $setting->smtp_port,
            'mail.username' => $setting->smtp_username,
            'mail.password' => $setting->smtp_password,
            'mail.encryption' => $setting->smtp_encryption,
            'mail.from.address' => $setting->smtp_from_address,
            'mail.from.name' => $setting->smtp_from_name,
        ]);

        (new \Illuminate\Mail\MailServiceProvider(app()))->register();

之后,我恢复原来的配置:

        config([
            'mail' => $originalMailConfig
        ]);

        (new \Illuminate\Mail\MailServiceProvider(app()))->register();

到现在为止都没问题。 但如果它已排队,则即使提供了任何其他 SMTP 配置,也只会为所有后续电子邮件采用启动队列工作程序后的第一个配置。 config/mail.php 中的默认配置将被覆盖。但这仅在第一次有效。

我在 AppServiceProvider::boot 方法中进行了设置(SMTP 配置存储在通知中):

    Queue::before(function (JobProcessing $event) {

        // Handle queued notifications before they get executed
        if (isset($event->job->payload()['data']['command']))
        {
            $payload = $event->job->payload();
            $command = unserialize($payload['data']['command']);

            // setting dynamic SMTP data if required
            if (isset($command->notification->setting))
            {
                config([
                    'mail.host' => $command->notification->setting->smtp_host,
                    'mail.port' => $command->notification->setting->smtp_port,
                    'mail.username' => $command->notification->setting->smtp_username,
                    'mail.password' => $command->notification->setting->smtp_password,
                    'mail.encryption' => $command->notification->setting->smtp_encryption,
                    'mail.from.address' => $command->notification->setting->smtp_from_address,
                    'mail.from.name' => $command->notification->setting->smtp_from_name,
                ]);

                (new \Illuminate\Mail\MailServiceProvider(app()))->register();
            }
        }

    });

当然,原始配置会恢复:

    Queue::after(function (JobProcessed $event) use ($originalMailConfig) {

        $payload = $event->job->payload();
        $command = unserialize($payload['data']['command']);

        // restore global mail settings
        if (isset($command->notification->setting))
        {
            config([
                'mail' => $originalMailConfig
            ]);

            (new \Illuminate\Mail\MailServiceProvider(app()))->register();
        }

    });

看来,Swift Mailer 有一个缓存或类似的东西。我注册了一个新的 MailServiceProvider,它应该简单地替换旧的。因此,如果我使用新的 SMTP 数据设置配置,新注册的提供商应该采用它们。记录配置甚至在 TransportManager 中显示,在发送邮件之前设置了正确的 SMTP 数据,但邮件是使用第一个设置的配置发送的。

我找到了这个线程并尝试了链接的解决方案,但结果相同:如何设置动态 SMTP 详细信息 laravel https://stackoverflow.com/questions/42626492/how-to-set-dynamic-smtp-details-laravel

所以我需要一种方法来覆盖 Services / ServiceProvider / SMTP 配置。即使主管重新启动队列,也有可能同时发送多封具有不同配置的电子邮件。


在 Laravel 5.4+ 中,我看到 Mailer 类是一个包含 MailTransport 类的单例,它负责 SMTP 邮件的配置,也是一个单例;我只需使用以下方法覆盖配置:

首先,我设置了一个特征,这样我就可以在某些邮件上打开此功能:

trait MailSenderChangeable
{
    /**
     * @param array $settings
     */
    public function changeMailSender($settings)
    {
        $mailTransport = app()->make('mailer')->getSwiftMailer()->getTransport();
        if ($mailTransport instanceof \Swift_SmtpTransport) {
            /** @var \Swift_SmtpTransport $mailTransport */
            $mailTransport->setUsername($settings['email']);
            $mailTransport->setPassword($settings['password']);
        }
    }
}

然后,在邮件类的 build() 方法中,您可以利用上述特征并调用:

    $this->changeMailSender([
        'email'=>$this->company->email,
        'password'=>$this->company->email_password,
    ]);

Boom,让 Laravel 来做剩下的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Laravel 5.4 中为排队电子邮件设置动态 SMTP 数据? 的相关文章

  • Laravel Blade - 链/嵌入多种布局

    在我最喜欢的模板框架中 它们通常具有嵌套布局的能力 这在 Blade 中是可能的吗 例如 master blade php yield content 导航 blade php extend master
  • Laravel 中的支付网关回调时会话会自动销毁

    我正在尝试将 CCavenue com 支付网关集成到我的 Laravel 7 项目中 我面临的唯一问题是在回调 url 中 从支付网关获取发布数据后 活动会话会自动销毁 我还向中间件添加了 CSRF 例外 PayController 生成
  • @apply 在 Laravel Mix 中的 Vue 组件内不起作用

    我在 Laravel 中使用 Tailwind CSS 和 VueJS 组件 如下所示
  • 将策略应用到资源控制器

    我有一个CRUD资源定义通过Route resource User UserController 既然可以生成CRUDGates and Policies 有没有办法应用这样的Gate Policy 以便将相应的Gate Policy应用于
  • 使用 Mock 对 Laravel 5 Mail 进行单元测试

    有没有办法在 Laravel 5 中测试 Mail 尝试了我在互联网上看到的唯一合法的模拟示例 但它似乎只适用于 Laravel 4 下面的当前代码 mock Mockery mock Swift Mailer this gt app ma
  • 将 Laravel 集合/数组转换为 Javascript 数组

    我想将 Laravel 中的数组分配给 JavaScript 数组 我已经从我的AppServiceProvider和 json decoded 它像 View composer function view users Users all
  • 如何在 Laravel Mix 中将公共路径更改为包含下划线的路径?

    Laravel 5 4 中引入了 Mix 来编译资产并维护资产管道 Mix 默认为您的公共目录被命名public 在许多情况下 包括我的 我的公共目录被称为其他名称 就我而言 是public html 如何更改资源编译到的公共目录 我尝试过
  • Laravel 5.6 - 注册表无法正常工作并且不显示任何错误

    在我最近的一个项目中 定制登记表不管用 当我单击注册按钮时 它会重新加载注册表单 不会打印任何错误 并且不会将数据插入数据库中 这是注册表的外观 这里是移民文件代码 public function up Schema create user
  • 在 Laravel 中按数据透视表 create_at 排序

    在我的数据库中 我有以下表格 courses id 名称 创建时间 更新时间 students id 名称 创建时间 更新时间 课程 学生 id course id student id created at updated at 我正在尝
  • Laravel 5.1 中的VerifyCsrfToken.php 第 53 行:(Firefox 浏览器)中出现 TokenMismatchException?

    我试图找出为什么会出现这个错误 即使它是全新安装的 我在我的项目中遇到了这个错误 所以我用谷歌搜索 没有一个答案对我有用 所以我创建了新项目并复制了所有控制器 视图和模型 几个小时后工作正常 再次出现令牌不匹配错误 为什么在 laravel
  • Laravel - 停止并发访问记录

    在 Laravel 中 有什么方法可以停止同时与同一条记录交互 例如 如果用户 A 正在编辑一条记录 那么我同时需要阻止用户 B 编辑同一条记录 注意 我在 Laravel 5 2 中使用 SESSION DRIVER file 目前大约有
  • 如何从导出的 csv 文件中删除双引号

    我正在使用 Laravel 5 8 并且添加了 Maatwebsite 包 用于从数据库表导出 CSV 文件 这是我导出的类 class ConfirmedExport implements FromCollection WithHeadi
  • Laravel 广播:通知与事件

    我阅读了 laravel 文档Events and Notifications 似乎我们可以触发一个事件 并从该事件中触发 使用ShouldBroadcast接口 将其广播到我理解的 laravel echo 另一方面我们可以使用通知via
  • laravel 中哪里可以设置标题

    我想将标题设置为array Cache Control gt no cache no store max age 0 must revalidate Pragma gt no cache Expires gt Fri 01 Jan 1990
  • PHPUnit\Framework\TestCase 和 Tests\TestCase 有什么区别?

    我注意到在示例测试中 这两个类是内置的 功能测试 gt use Tests TestCase 单元测试 gt PHPUnit Framework TestCase 两者有什么区别 在什么情况下您会使用其中一种 PHPUnit Framewo
  • 在 Laravel 中动态设置数据库连接和语言

    我有 3 个域指向同一个Laravel应用 我想要的是每个人都连接到自己的数据库并根据 TLD 加载自己的语言文件 我可以在哪个文件中设置这些设置 我可以直接在配置文件中执行此操作 或者可以在加载配置之前执行某些事件 我拥有的是一个简短的函
  • 在 Laravel 中的编辑表单上获取选定选项

    我的网站订单有一个可编辑的表单 并且有以下字段 User quantity note status 我在此表单中还有其他选项 但只有这些字段对我来说很重要 以便能够获取默认值 例如 我希望能够查看用户默认订购的数量 然后我可以更改它或保留它
  • Laravel 从 API 响应中删除标头值

    Laravel 应用程序版本 5 6 我希望从 API 响应中显示的 Cache Control 标头中删除 private 值 我有一个中间件添加 无缓存 和 无存储 值 response next request response gt
  • 如何从 Laravel 执行存储过程

    我需要在表单提交数据后执行存储过程 我让存储过程按照我想要的方式工作 并且我的表单正常工作 我只是不知道从 laravel 5 执行 sp 的语句 它应该是这样的 执行 my stored procedure 但我似乎在网上找不到类似的东西
  • Laravel/Homestead - OSX - Vagrant 连接超时

    Problem 我正在尝试让 Laravel Homestead 在我的 Mac Book Air 上运行 我已按照以下指示进行操作http laravel com docs 4 2 homestead http laravel com d

随机推荐

  • C 中快速高效的最小二乘拟合算法?

    我正在尝试对两个数据数组实现线性最小二乘拟合 时间与幅度 到目前为止 我知道的唯一技术是测试 y m x b 中所有可能的 m 和 b 点 然后找出最适合我的数据的组合 以便其误差最小 然而 我认为迭代这么多组合有时是没有用的 因为它测试了
  • matlab中字符串的最大长度

    我是 matlab 的新手 我正在尝试解决以下场景 我有大字符串 需要对其进行异或编码才能获得值 我正在使用以下代码片段来执行该操作 clear clc first abceeeeeeeeeeeeeeeddddddddddddd secon
  • 单击时显示 NSUserNotification 附加操作

    在上图中 您可以在 OS X 上看到两个通知 第一个来自我的应用程序 第二个来自 Apple 的 Reminders app 在图像中你可以看到otherButtonTitle 完成 和actionButtonTitle 之后 第二个通知
  • Plotly R:根据不同的条形颜色更改hoverinfo字体颜色

    我有这个数据框 df2 data frame value c 9 2 7 3 6 key c ar or br gt ko 这是我必须生成的代码这个情节 https i stack imgur com gZCg1 png df2 gt pl
  • 令人困惑的 PHP 按位 NOT 行为

    在 PHP 中 如果我运行以下简单程序 number 9 var dump number 我的输出是 int 10 这让我很困惑 我thought 是按位NOT操作员 所以我期待类似的事情 if binary 9 is 0000000000
  • Android Studio 上的 Android Tesseract OCR [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 一段时间以来 我一直在尝试将 tesseract 包含在 Android Studio 上的 Andro
  • 用户代码可以安全地使用结构体填充吗?

    假设我有一个如下所示的结构 struct Struct char Char int Int and sizeof int 大于 1 编译器会添加填充Char成员变量 编译器生成的代码是否允许更改填充字节的值 我的意思是 如果我使用指针算术并
  • 使用 Apache POI 访问数据透视表的字段设置

    我正在创建一个工作簿 其中包含来自数据源的填充数据的工作表 然后使用该数据的数据透视表视图创建第二个工作表 一切工作正常 但我似乎无法更改数据透视表的默认外观 我正在尝试获取设置 行标签 gt 从列表中单击一个 gt 字段设置 gt 小计
  • 所有对mock的调用在设置字符串参数时都必须有相应的设置

    我正在测试一个简单的方法 当我运行测试时出现错误 模拟上的所有调用都必须有相应的设置 在最后一行 dataField DefaultValue orderNumber ToString 什么会导致这种情况呢 我只是设置一个字段 void I
  • 为什么foldr可以在Haskell中的无限列表上工作,而foldl却不能?

    我一直在努力理解foldl vs foldr vs foldl 在哈斯克尔 我理解共识是使用foldr when f第二个参数是惰性的 因为它反映了列表的结构 foldl 当我们知道需要处理整个列表并且f其论点很严格 我对这样的情况特别感兴
  • 在 Perl 中是否有更好的方法来确定经过的时间?

    my start time Time HiRes gettimeofday my diff Time HiRes tv interval start time print n n diff n 可能吧 取决于你所说的 更好 是什么意思 如果
  • Google Apps 抓取脚本会定期运行,直到提取所有网站的内页吗?

    我已经完成了一个抓取脚本 通过爬行逐一抓取任何网站 要输入的网址 的内部页面 获取其他内部网址并继续获取所有页面并提取其纯文本 剥离的html 该脚本运行良好 但 google 脚本运行限制为 6 分钟 因此对于大型网站 它无法运行 6 分
  • 需要在 Internet Explorer 脚本错误中查找行/字符的实际位置?

    我在 IE 中收到脚本错误 线路 59 字符 71 错误 需要标识符 字符串或数字 代码 0 第 59 行 第 71 字符似乎与我的代码实际上并不对应 它甚至没有说是什么文件 但我已经查看了我的主要 javascript 文件 查看了页面源
  • 如何使用 imagemagick 制作高质量的动画图像

    我想从这些 png 图像制作一个动画 gif 我用这个命令来做到这一点 convert layers OptimizePlus delay 25x100 ps1 png loop 0 ps1 gif 它成功制作了 gif 动画 但是输出的质
  • 数据库中是否有用于版本控制的通用选项?

    我在开发项目中使用 SVN 的经验很少 而且我在关系数据库方面的经验也很少 我知道表和 SQL 语句等基本概念 但距离专家还很远 我想知道是否有像 SVN 这样的通用版本控制类型系统 但它使用数据库而不是文件 我想要与 SVN 相同的功能
  • android:back(设备后退按钮)事件在 Titanium 中不起作用

    您好 我正在从事 Android 应用程序开发 我正在使用 Titanium studio 进行开发 我创建了一个简单的应用程序 我想在我的应用程序中捕获设备后退按钮事件 因为我不想在钛中使用 android 默认选项卡 我正在创建自己的选
  • Reachability Classes 崩溃程序 - 不知道为什么

    我的应用程序中有一个需要联网的对象的 互联网感知 基类 所有需要互联网感知的对象都继承自它 正如你可以想象的那样 我分配和释放了很多这样的对象 互联网感知基类具有以下代码 用于与用于检查互联网状态的可达性类进行交互 import Reach
  • 如何使 div 为页面大小的 80%?

    我想让页面容器 div 的上边距为 10 下边距为 10 我怎样才能让div一直占据页面剩余的80 无论它是否有内容 这应该有效
  • 在 C++ 中迭代链表比在具有类似内存访问的 Go 中慢

    在各种情况下 我观 察到 C 中的链表迭代始终比 Go 中慢 10 15 我在 Stack Overflow 上第一次尝试解开这个谜团是here https stackoverflow com questions 50274433 iter
  • 如何在 Laravel 5.4 中为排队电子邮件设置动态 SMTP 数据?

    在我的应用程序中 每个用户都可以使用自己的 SMTP 服务器 因此必须提供配置 我正在使用 Laravel 通知来发送电子邮件 如果我不使用队列 这意味着同步 则没有问题 我做了一个自定义的可通知特征 config mail host gt