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

Ale*_*not 3 php laravel laravel-5.4

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

  • SMTP
  • 发邮件
  • SES
  • Mailgun
  • 山魈
  • Sparkpost

您可以找到这些驱动程序的说明 framework/src/Illuminate/Mail/TransportManager.php

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

Ale*_*not 11

首先,我们必须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;
    }
}
Run Code Online (Sandbox Code Playgroud)

下一步是扩展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']
        );
    }

}
Run Code Online (Sandbox Code Playgroud)

下一步是扩展现有的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);
        });
    }

}
Run Code Online (Sandbox Code Playgroud)

最后一步是修改配置文件.

在里面 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'),
],
Run Code Online (Sandbox Code Playgroud)

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

  • guggle 在 5.6 中的意思是 Guzzle&gt; (3认同)
  • 对于laravel 5.6或更高版本,您只需删除Swift_Mime_Message并将其替换为\ Swift_Mime_SimpleMessage (2认同)