使用Laravel 5.3通过Mailable类发送电子邮件时使用用户定义的smtp

时间:2017-01-16 09:45:07

标签: laravel

标题说明了一切。我正在尝试创建一个应用程序,用户可以使用我的应用程序定义自己的smtp并向客户发送电子邮件。如何手动更改Mailable类将使用的smtp信息?

对消息进行排队也很重要,所以我猜Mailable类应该显示smtp信息。

我能想到的一个解决方案是创建一个EMail模型并保存发送电子邮件所需的所有数据,包括从用户到数据库的smtp设置。然后,我可以创建一个排队的作业来检索这个模型,然后只调用Email对象上的send方法。发送方法新闻mailable类,用 Config :: set()设置smtp配置并发送它。

它会起作用还是我的想法有缺陷......

1 个答案:

答案 0 :(得分:0)

如果您查看\Illuminate\Mail\TransportManager类,可以在createSmtpDriver()方法中找到从配置中提取SMTP设置的位置。在您的配置中,如果您将驱动程序设置为smtp,Laravel将调用此方法。

Laravel Mailer类包含一个设置Swift Mailer实例的公共方法。因此,您可以在发送消息之前创建自己的实例并通过它(我还没有对此进行测试):

public function yourMethod(Mailer $mailer)
{
    $transport = Swift_SmtpTransport::newInstance(
        'YourHost', 'YourPort'
    );
    $transport->setUsername('YourPassword');
    $transport->setPassword('YourPassword');
    $swift = new Swift_Mailer($transport);

    $mailer->setSwiftMailer($swift);

    $mailer->send(...);
}

通常,如果你想在像Mailer这样的Laravel类中引入一些自定义功能,你可以定义自己的驱动程序(在这种情况下是你自己的传输)并使用Laravel的API来扩展它并添加你自己的发送邮件的方法。

同样,我没有对此进行测试,但您可以扩展TransportManager类以添加自己的驱动程序。您可以将以下代码放在AppServiceProvider

$manager = app('swift.transport'); // Will get you an instance of TransportManager
$manager->extend('customsmtp', function() {
    // Your custom code to create your own transport for the mailer. Just like the createSmtpDriver method in TransportManager.
    $transport = Swift_SmtpTransport::newInstance(
        'YourHost', 'YourPort'
    );
    $transport->setUsername('YourPassword');
    $transport->setPassword('YourPassword');

    return $transport;
});