为Laravel 5.4创建自己的邮件提供程序

时间:2017-07-04 09:18:56

标签: php laravel laravel-5.4

有时我们必须集成自定义邮件提供程序。但是Laravel有一个固定的列表。他们在这里:

  • SMTP
  • sendmail
  • SES
  • Mailgun
  • 山魈
  • Sparkpost

您可以在framework/src/Illuminate/Mail/TransportManager.php

中找到有关这些驱动程序的说明

问题是这些说明是固定的。当然你可以修改供应商文件,但这将是一个肮脏的黑客。所以在答案中,我将提供一些指导如何以正确的方式实现自己的自定义邮件驱动程序。

1 个答案:

答案 0 :(得分:8)

首先我们必须为我们的邮件程序创建自定义Transport

我们的邮件程序将通过某个API接口与另一台服务器通信。文件贝娄是一个模型,所以我把它放到我的模型文件夹中。如果您没有为模型分隔文件夹,只需将文件放入app目录即可。

让我们称之为SmithTransport.php

<?php 

use GuzzleHttp\ClientInterface;
use Illuminate\Mail\Transport\Transport;

class SmithTransport extends Transport
{
    protected $client;

    protected $key;

    protected $domain;

    protected $url;

    public function __construct(ClientInterface $client, $key, $domain)
    {
        $this->key = $key;
        $this->client = $client;
        $this->setDomain($domain);
    }

    public function send(Swift_Mime_Message $message, &$failedRecipients = null)
    {
        $this->beforeSendPerformed($message);

        $options = ['auth' => ['api', $this->key]];

        $message->setBcc([]);

        $from_email = '';
        $from_name = '';
        $to_email = '';
        $to_name = '';

        foreach ($message->getFrom() as $email => $name) {
            $from_email = $email;
            $from_name = $name;
        }

        foreach ($message->getTo() as $email => $name) {
            $to_email = $email;
            $to_name = $name;
        }

        $options['form_params'] = [
            'from_email' => $from_email,
            'from_name'  => $from_name,
            'to_email'   => $to_email,
            'to_name'    => $to_name,
            'subject'    => $message->getSubject(),
            'body'       => $message->getBody()
        ];

        return $this->client->post($this->url, $options);
    }

    public function getKey()
    {
        return $this->key;
    }

    public function setKey($key)
    {
        return $this->key = $key;
    }

    public function getDomain()
    {
        return $this->domain;
    }

    public function setDomain($domain)
    {
        $this->url = 'https://api.mymailer.com/send?key=' . $this->key;

        return $this->domain = $domain;
    }
}

下一步正在扩展TransportManager。因为我们必须为自定义传输添加说明。

因此,如果您没有为模型分隔目录,那么在模型目录或SmithTransportManager.php目录中它将是app

<?php

use Illuminate\Mail\TransportManager;

class SmithTransportManager extends TransportManager
{
    protected function createSmithDriver()
    {
        $config = $this->app['config']->get('services.smith', []);

        return new SmithTransport(
            $this->guggle($config),
            $config['secret'], $config['domain']
        );
    }

}

下一步正在扩展现有的MailServiceProvider

所以我们的提供商将在app/Providers/MailServiceProvider.php

<?php namespace App\Providers;

use Illuminate\Mail\MailServiceProvider as MailProvider;

class MailServiceProvider extends MailProvider
{
    protected function registerSwiftTransport()
    {
        $this->app->singleton('swift.transport', function ($app) {
            return new \SmithTransportManager($app);
        });
    }

}

最后一步正在修改配置文件。

config/app.php

您必须删除(或评论行)标准Illuminate\Mail\MailServiceProvider::class,

并将App\Providers\MailServiceProvider::class,添加到providers部分。

config/services.php我们必须添加配置getter:

'smith' => [
    'domain' => env('SMITH_DOMAIN'),
    'secret' => env('SMITH_SECRET'),
],

这就是全部!希望它有所帮助,因为我没有在其他关于自定义MailTransport的文档中找到任何信息。