Silex + Swift Mailer无法正常工作

时间:2015-02-25 12:49:12

标签: php swiftmailer silex mandrill

我有一个使用Swift Mailer的Silex应用程序,但似乎配置未从$app['swiftmailer.options']加载。

我在我的引导程序文件中注册了该服务

$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('no-reply@domain.com'))
    ->setTo(array('recipient@example.com'))
    ->setBody('My email content')
    ->setContentType("text/html");

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

send函数返回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 个答案:

答案 0 :(得分:2)

默认情况下,SwiftmailerServiceProvider使用假脱机传输来对电子邮件进行排队,并在TERMINATE阶段(将响应发送回客户端之后)全部发送。如果您不致电Application->run(),则会绕过此过程。您的邮件将留在假脱机中,永远不会被发送。

如果您想在正常的Silex流程之外发送邮件,可以使用

手动刷新假脱机
if ($app['mailer.initialized']) {
    $app['swiftmailer.spooltransport']
        ->getSpool()
        ->flushQueue($app['swiftmailer.transport']);
}

直接来自SwiftmailerServiceProvider。

或者您可以使用

简单地关闭假脱机
$app['swiftmailer.use_spool'] = false;

答案 1 :(得分:0)

试试这个:

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

它不在文档中。