【问题标题】:Swiftmailer remove attachment after sendSwiftmailer 发送后删除附件
【发布时间】:2013-03-26 16:58:32
【问题描述】:

我在使用 Symfony 2.1 和 Swiftmailer 发送电子邮件后尝试删除附件文件,但如果我在返回响应对象(重定向)之前删除文件,电子邮件没有发送。

我想这是因为 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 来清理文件,但我不喜欢使用它。

谢谢!

【问题讨论】:

    标签: php symfony swiftmailer


    【解决方案1】:

    您可以在此处查看处理内存假脱机的代码: 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'));
    

    【讨论】:

      【解决方案2】:

      我不确定,但消息假脱机可能会导致此问题。在 SF2 中,默认使用内存假脱机,这意味着消息是在内核终止事件上发送的。

      因此您必须在删除文件之前刷新线轴。

      如果这是您的问题的原因,请在此处查找解释清楚的解决方案: http://sgoettschkes.blogspot.de/2012/09/symfony-21-commands-and-swiftmailer.html

      【讨论】:

        【解决方案3】:

        为了完成james_t很好的回答,如果你使用multiple mailers,需要做一些修改。

        替换

        //  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);
        

        【讨论】:

          猜你喜欢
          • 2023-03-16
          • 2012-10-23
          • 2016-12-01
          • 2017-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-15
          • 1970-01-01
          相关资源
          最近更新 更多