Изменить почтовый транспорт в Ларавел 4

1

Похоже, что L4 жестко закодирован для использования SMTP с Swiftmailer. Как мы можем изменить тип транспорта на sendmail?

Теги:
laravel-4
swiftmailer

1 ответ

1
Лучший ответ

Это не так просто, как обмен транспорта на другой. Как вы сказали, транспорт жестко закодирован в Illuminate\Mail\MailServiceProvider.

Вы, вероятно, хотели бы расширить реализацию L4 Mail самостоятельно, заменив ее в вашем конфигурационном файле config/app.php:

  • Замените массив поставщика для почтового провайдера:

конфиг /app.php

...
'providers' => array(
'SendmailServiceProvider',
  • добавить путь sendmail к двоичному:

конфиг /mail.php

'sendmail_path' => '/usr/bin/sendmail -bs',
  • Убедитесь, что ваш файл composer.json autoload "classmap из приложения/библиотек:"

composer.json:

....    
"autoload": {
    "classmap": [
        "app/libraries",
....
  • Добавьте поставщика услуг Sendmail:

приложение/библиотеки /SendmailServiceProvider.php

<?php

use \Swift_Mailer;
use Illuminate\Support\ServiceProvider;
use Illuminate\Mail\Mailer as Mailer;
use Swift_SendmailTransport as SendmailTransport;

class SendmailServiceProvider extends ServiceProvider {

    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->registerSwiftMailer();

        $this->app['mailer'] = $this->app->share(function($app)
        {
            // Once we have create the mailer instance, we will set a container instance
            // on the mailer. This allows us to resolve mailer classes via containers
            // for maximum testability on said classes instead of passing Closures.
            $mailer = new Mailer($app['view'], $app['swift.mailer']);

            $mailer->setLogger($app['log']);

            $mailer->setContainer($app);

            $from = $app['config']['mail.from'];

            // If a "from" address is set, we will set it on the mailer so that all mail
            // messages sent by the applications will utilize the same "from" address
            // on each one, which makes the developer life a lot more convenient.
            if (is_array($from) and isset($from['address']))
            {
                $mailer->alwaysFrom($from['address'], $from['name']);
            }

            return $mailer;
        });
    }

    /**
     * Register the Swift Mailer instance.
     *
     * @return void
     */
    protected function registerSwiftMailer()
    {
        $config = $this->app['config']['mail'];

        $this->registerSwiftTransport($config);

        // Once we have the transporter registered, we will register the actual Swift
        // mailer instance, passing in the transport instances, which allows us to
        // override this transporter instances during app start-up if necessary.
        $this->app['swift.mailer'] = $this->app->share(function($app)
        {
            return new Swift_Mailer($app['swift.transport']);
        });
    }

    /**
     * Register the Swift Transport instance.
     *
     * @param  array  $config
     * @return void
     */
    protected function registerSwiftTransport($config)
    {
        $this->app['swift.transport'] = $this->app->share(function($app) use ($config)
        {
            extract($config);

            // The Swift SMTP transport instance will allow us to use any SMTP backend
            // for delivering mail such as Sendgrid, Amazon SMS, or a custom server
            // a developer has available. We will just pass this configured host.
            $transport = SendmailTransport::newInstance($sendmail_path);

            // Once we have the transport we will check for the presence of a username
            // and password. If we have it we will set the credentials on the Swift
            // transporter instance so that we'll properly authenticate delivery.
            if (isset($username))
            {
                $transport->setUsername($username);

                $transport->setPassword($password);
            }

            return $transport;
        });
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return array('mailer', 'swift.mailer', 'swift.transport');
    }

}

На самом деле это не проверено, но должно работать нормально. Попробуйте поместить это в route.php и немного поиграйте:

Route::get('/', function()
{
    Mail::send('emails.auth.reminder', array('token' => '123456'), function($m)
    {
        $m->from('[email protected]', 'Laravel');

        $m->to('[email protected]')->cc('[email protected]');

    });
});
  • 0
    Не уверен, но кажется, что Тейлор в основном реализовал почтовую функцию PHP как альтернативный транспорт, если это интересно для вашего случая использования: github.com/laravel/laravel/blob/develop/app/config/mail.php

Ещё вопросы

Сообщество Overcoder
Наверх
Меню