9

データベースにクエリを実行し、レポートを作成してアドレスに電子メールで送信するカスタムコンソールコマンドを作成しました。しかし、メールをうまく送信できないようです。アプリケーション内の他の場所にある通常のコントローラー内から電子メールを正常に送信できます。また、Swift_Mailerインスタンスを手動で作成および構成し、コンテナー経由で取得しない場合は、コンソールコマンド内から電子メールを送信することもできます。

これが私のコンソールコマンドの簡略版です:

<?php

namespace Foo\ReportBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class ExpiryCommand extends ContainerAwareCommand
{
    protected function configure()
    {
        $this->setName('report:expiry')
            ->setDescription('Compile and send e-mail listing imminent expiries');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        /* ... */
        $message = \Swift_Message::newInstance()
            ->setSubject('Expiry report')
            ->setFrom('DoNotReply@domain.com')
            ->setTo('recipient@domain.com')
            ->setBody($body);

        $mailer = $this->getContainer()->get('mailer');

/*      This works...
        $transport = \Swift_SmtpTransport::newInstance('smtp.domain.com', 25)
            ->setUsername('username')
            ->setPassword('password');
        $mailer = \Swift_Mailer::newInstance($transport);
*/
        $result = $mailer->send($message);
        $output->writeln($result);
    }
}

Swiftmailerは、app/config/config.ymlファイル内でSMTP経由で送信するように構成されています(delivery_address: dev@domain.comで設定されていますapp/config/config_dev.yml)。

swiftmailer:
    transport: smtp
    host: smtp.domain.com
    username: username
    password: password
    spool:
        type: memory

コマンドを実行する1と、コマンドラインに出力されます。これは、コマンドが成功したことを意味していると思います。ただし、メールサーバーのログを同時に監視していて、接続すらしていません。

構成がメーラーにロードされていることを確認するために、スプールをからに変更しmemoryfileコマンドの実行時にメッセージがファイルシステムにスプールされ、コマンドラインで。を使用してスプールを正常にフラッシュできphp app/console swiftmailer:spool:sendます。

ここで何が起こっているのか、またはそれをさらにデバッグする方法についての提案はありますか?ファイルに何も表示されていませんapp/logs/dev.log。私はSymfony2.1.3-DEVを使用しています。

4

3 に答える 3

27

kernel.terminateいくつかのSymfonyとSwiftMailerのコードを掘り下げると、応答が送信された後に発生したイベントでメモリスプールがフラッシュされることがわかります。コマンドで機能するかどうかはわかりませんが、間違っている可能性があります。

コマンドの最後にこのコードを追加してみて、それが役立つかどうかを確認してください。

$transport = $this->container->get('mailer')->getTransport();
if (!$transport instanceof \Swift_Transport_SpoolTransport) {
    return;
}

$spool = $transport->getSpool();
if (!$spool instanceof \Swift_MemorySpool) {
    return;
}

$spool->flushQueue($this->container->get('swiftmailer.transport.real'));
于 2012-10-29T14:10:34.203 に答える
2

メモリスプールの代わりにファイルスプールを使用してください。あなたのapp/config/config.yml:を変更します

swiftmailer:
    transport: "%mailer_transport%"
    host:      "%mailer_host%"
    username:  "%mailer_user%"
    password:  "%mailer_password%"
    spool:     { type: file, path: %kernel.root_dir%/spool }
于 2013-04-23T15:23:56.853 に答える
-1

実行アクションの最後にこれを追加するだけです。

$container = $this->getContainer();
$mailer = $container->get('mailer'); 
$spool = $mailer->getTransport()->getSpool();    
$transport = $container->get('swiftmailer.transport.real');
$spool->flushQueue($transport);
于 2014-08-21T13:12:32.330 に答える