Seems that when I search for the right keyword (custom mail driver), I find more answer :)
https://stackoverflow.com/questions/44901912/creating-own-mail-provider-for-laravel-5-4 It was a good input, but don't perfectly work for Laravel 5.6.14
Below, how I did it :
app\Mail folder
new SparkPostEUTransport.php
namespace App\Mail;
use Swift_Mime_SimpleMessage;
use GuzzleHttp\ClientInterface;
use Illuminate\Mail\Transport\SparkPostTransport;
class SparkPostEUTransport extends SparkPostTransport
{
public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null)
{
$this->beforeSendPerformed($message);
$recipients = $this->getRecipients($message);
$message->setBcc([]);
$response = $this->client->post('https://api.eu.sparkpost.com/api/v1/transmissions', [
'headers' => [
'Authorization' => $this->key,
],
'json' => array_merge([
'recipients' => $recipients,
'content' => [
'email_rfc822' => $message->toString(),
],
], $this->options),
]);
$message->getHeaders()->addTextHeader(
'X-SparkPost-Transmission-ID', $this->getTransmissionId($response)
);
$this->sendPerformed($message);
return $this->numberOfRecipients($message);
}
}
new SparkPostEUTransportManager.php
namespace App\Mail;
use Illuminate\Mail\TransportManager;
class SparkPostEUTransportManager extends TransportManager
{
/**
* Create an instance of the SparkPost Swift Transport driver.
*
* @return \App\Mail\SparkPostEUTransport
*/
protected function createSparkPostEUDriver()
{
$config = $this->app['config']->get('services.sparkposteu', []);
return new SparkPostEUTransport(
$this->guzzle($config), $config['secret'], $config['options'] ?? []
);
}
}
app\Providers folder
new MailServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Mail\MailServiceProvider as MailProvider;
use App\Mail\SparkPostEUTransportManager as TransportManager;
class MailServiceProvider extends MailProvider
{
protected function registerSwiftTransport()
{
$this->app->singleton('swift.transport', function ($app) {
return new TransportManager($app);
});
}
}
config folder
update services.php - new line :
'sparkposteu' => [
'secret' => 'your-secret-key',
],
update app.php - new line :
'providers' => [
/*
* Laravel Framework Service Providers...
*/
[...]
//Illuminate\Mail\MailServiceProvider::class, //to be deleted
[...]
/*
* Application Service Providers...
*/
[...]
App\Providers\MailServiceProvider::class, //to be added
[...]
],
.env
MAIL_DRIVER=SPARKPOSTEU
I just hope there is no big change in Mail management in the following versions of laravel :)