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

标签 php laravel laravel-5.4

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

  • 邮件传输协议(protocol)
  • 发送邮件
  • 类(class)
  • 邮枪
  • 山魈
  • Spark 邮报

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

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

最佳答案

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

我们的邮件程序将通过一些 API 接口(interface)与另一台服务器通信。下面的文件是一个模型,所以我把它放在我的模型文件夹中。如果您没有单独的模型文件夹,您可以将文件放入 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.phpapp 目录(如果您没有单独的模型目录)。

<?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 的信息。

关于php - 为 Laravel 5.4 创建自己的邮件提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44901912/

相关文章:

PHP - Mysql日期转换

php - PHP 中的 Http 响应代码枚举

php - Laravel 卡住了最后一个在论坛发帖的用户

mysql - 如何使用 View 从图像中获取 Laravel 集合

PHP Laravel foreach 不修改值

php - 将整数分配为变量

php - xss代码上的preg_replace

php - 如何使用 PHP 更新数据库中的特定记录?

php - Ramsey Uuid 不适用于新安装的 laravel 5.4

mysql - Laravel Eloquent 关系 'with' 关键字