app/Providers/Mail/CustomMailServiceProvider.php
<?php
namespace App\Providers\Mail;
use Illuminate\Mail\MailServiceProvider;
class CustomMailServiceProvider extends MailServiceProvider
{
protected function registerSwiftTransport()
{
$this->app['swift.transport'] = $this->app->share(function($app) {
return new CustomTransportManager($app);
});
}
}
app/Providers/Mail/CustomTransportManager.php
<?php
namespace app\Providers\Mail;
use App\MailConfig;
use Illuminate\Mail\TransportManager;
use Cache;
class CustomTransportManager extends TransportManager
{
public function __construct($app)
{
$this->app = $app;
/** @var MailConfig $config */
$config = Cache::rememberForever('mail_config', function () {
return MailConfig::first();
});
if ($config) {
$this->app['config']['mail'] = [
'driver' => $config->driver,
'host' => $config->host,
'port' => $config->port,
'from' => [
'address' => $config->from_address,
'name' => $config->from_name
],
'encryption' => $config->encryption,
'username' => $config->username,
'password' => $config->password,
'sendmail' => $config->sendmail,
'pretend' => $config->pretend
];
}
}
}
Son olarak app/config/app.php dosyasında mevcut MailServiceProvider girdisini kaldırıp yerine hazırladığımızı ekliyoruz:
app/config/app.php
'providers' => [
// ...
//Illuminate\Mail\MailServiceProvider::class,
App\Providers\Mail\CustomMailServiceProvider::class,
// ...
],
Kullandığım modelin adı MailConfig. app/Providers/Mail/CustomTransportManager.php içerisinde mail_config anahtarı ile Cache kullanıyorum. Mail ayarları değiştirildiğinde bu anahtarı Cache::forget('mail_config'); ile silip yenilemeniz lazım ya da kendi yolunuzla yaparsınız.