Ale*_*not 3 php laravel laravel-5.4
有时我们必须集成自定义邮件提供程序.但是Laravel有一个固定的列表.他们来了:
您可以找到这些驱动程序的说明 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的文档中找到任何信息.
| 归档时间: |
|
| 查看次数: |
2073 次 |
| 最近记录: |