2

Symfony 2.1Swiftmailerでメールを送信した後、添付ファイルを削除しようとしていますが、応答オブジェクト(リダイレクト)を返す前にファイルを削除すると、メールが送信されません。

これは、symfonyが応答でメールを送信するためだと思います。そのため、メールが送信されると、添付ファイルはすでに削除されています。

例えば:

<?php

// DefaultCotroller.php

$message = \Swift_Message::newInstance($subject)
    ->setFrom('no-reply@dasi.es')
    ->setTo($emails_to)
    ->setBody($body, 'text/html')
    ->attach(\Swift_Attachment::fromPath('backup.rar'));

$this->get('mailer')->send();

unlink('backup.rar');  // This remove the file but doesn't send the email!

return $this->redirect($this->generateUrl('homepage'));

オプションは、ファイルをクリーンアップするためのcrontabを作成することですが、私はそれを使用したくないです。

ありがとう!

4

3 に答える 3

10

ここでメモリスプールを処理するコードを見ることができます: https ://github.com/symfony/SwiftmailerBundle/blob/master/EventListener/EmailSenderListener.php

これは、送信する電子メールをバッチ処理するために使用されます。

send()これを電話の後で電話の前に追加しunlink()て、電子メールを送信する動作を模倣することができます

        $transport = $this->container->get('mailer')->getTransport();  

        $spool = $transport->getSpool();

        $spool->flushQueue($this->container->get('swiftmailer.transport.real'));
于 2013-03-26T17:16:53.123 に答える
2

よくわかりませんが、メッセージスプールがこの問題を引き起こす可能性があります。SF2では、デフォルトでメモリスプールが使用されます。これは、メッセージがカーネル終了イベントで送信されることを意味します。

したがって、ファイルを削除する前にスプールをフラッシュする必要があります。

これが問題の原因である場合は、ここで十分に説明された解決策を探してください: http ://sgoettschkes.blogspot.de/2012/09/symfony-21-commands-and-swiftmailer.html

于 2013-03-26T17:15:23.807 に答える
1

james_tの非常に良い答えを完成させるために、複数のメーラーを使用する場合は、いくつかの変更が必要です。

交換

//  Default mailer
$mailer = $this->container->get('mailer');

$subject  = '...';
$from     = '...';
$to       = '...';
$body     = '...';

$message = \Swift_Message::newInstance()
    ->setSubject($subject)
    ->setFrom($from)
    ->setTo($to)
    ->setBody($body, 'text/html')
;

//  Put e-mail in spool
$result = $mailer->send($message);

//  Flush spool queue
$transport      = $mailer->getTransport();  
$spool          = $transport->getSpool();
$realTransport  = $this->container->get('swiftmailer.transport.real')
$spool->flushQueue($realTransport);

//  Custom mailer
$mailerServiceName  = 'myCustomMailer';
$customMailer       = $this->container->get("swiftmailer.mailer.".$mailerServiceName);

$subject  = '...';
$from     = '...';
$to       = '...';
$body     = '...';

$message = \Swift_Message::newInstance()
    ->setSubject($subject)
    ->setFrom($from)
    ->setTo($to)
    ->setBody($body, 'text/html')
;

//  Put e-mail in spool
$result = $customMailer->send($message);

//  Flush spool queue
$transport      = $customMailer->getTransport();  
$spool          = $transport->getSpool();
$realTransport  = $this->container->get('swiftmailer.mailer.'.$mailerServiceName.'.transport.real');
$spool->flushQueue($realTransport);
于 2018-11-01T15:55:51.737 に答える