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 回答