2013-03-24 3 views

ответ

1

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

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

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

конфигурации/app.php

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

конфигурации/mail.php

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

composer.json:

....  
"autoload": { 
    "classmap": [ 
     "app/libraries", 
.... 
  • Добавить y наш 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's 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'); 
    } 

} 

Не действительно проверял, но должно работать нормально. Попробуйте сделать это в routes.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

Не уверен, но, кажется, Тейлор impemented в ядре функции почты PHP в качестве альтернативного транспорта, если интересно для вашего сценария использования: https: //github.com/laravel/laravel/blob/develop/app/config/mail.php –