2015-02-25 6 views
4

У меня есть приложение Silex с Swift Mailer, но похоже, что конфигурация не была загружена с $app['swiftmailer.options'].Silex + Swift Mailer не работает

Я зарегистрировал службу в моем загрузочном файле

$app->register(new SwiftmailerServiceProvider()); 

И в моем файле конфигурации

$app['swiftmailer.options'] = array(
    'host' => 'smtp.mandrillapp.com', 
    'port' => '587', 
    'username' => 'MY_USERNAME', 
    'password' => 'MY_PASSWORD', 
    'encryption' => null, 
    'auth_mode' => null 
); 

И тогда я посылаю свою электронную почту с

$message = \Swift_Message::newInstance() 
    ->setSubject($this->app['forum_name'] . ' Account Verification') 
    ->setFrom(array('[email protected]')) 
    ->setTo(array('[email protected]')) 
    ->setBody('My email content') 
    ->setContentType("text/html"); 

$this->app['mailer']->send($message); 

Функция отправки возвращает 1 но письмо не было отправлено. Но, когда я попытаюсь вручную создать экземпляр Swift_SmtpTransport, письмо отправит.

$transport = \Swift_SmtpTransport::newInstance('smtp.mandrillapp.com', 587) 
    ->setUsername('MY_USERNAME') 
    ->setPassword('MY_PASSWORD'); 
... 
$mailer = \Swift_Mailer::newInstance($transport); 
$mailer->send($message); 

Таким образом, проблема $app['swiftmailer.options'] не читается и не загружается. Я что-то упустил?

Я следую инструкциям от here.

ответ

2

По умолчанию SwiftmailerServiceProvider использует буферизованный транспорт для отправки в очередь сообщений электронной почты и отправляет их во время этапа TERMINATE (после того, как ответ отправлен обратно клиенту). Если вы не вызываете Application->run(), вы обходите этот процесс. Ваша почта останется в очереди и никогда не будет отправлена.

Если вы хотите отправить почту за пределами нормального потока Silex, вы можете очистить катушку вручную с

if ($app['mailer.initialized']) { 
    $app['swiftmailer.spooltransport'] 
     ->getSpool() 
     ->flushQueue($app['swiftmailer.transport']); 
} 

Это взято непосредственно из SwiftmailerServiceProvider.

Или вы можете просто отключить подкачку с

$app['swiftmailer.use_spool'] = false; 
0

Попробуйте это:

$app->register(new \Silex\Provider\SwiftmailerServiceProvider(), array(
    'swiftmailer.options' => array(
     'sender' => 'sender', 
     'host' => 'host', 
     'port' => 'port', 
     'username' => 'username', 
     'password' => 'password' 
    ) 
)); 

Это не в документации.

Смежные вопросы