Swift_Mailer Symfony 3 добавить прослушиватель события для отправки события - PullRequest
0 голосов
/ 24 мая 2018

Как добавить eventListener в событие отправки swiftmailer?Каждый раз, когда я отправляю электронную почту, я создаю файл и прикрепляю его к электронной почте, а после отправки я хочу отменить связь этого файла.Как это сделать?Спасибо.

 file_put_contents($path, implode(";\r\n", $result));
$message = (new \Swift_Message('VAT checking result !'))
            ->setFrom('vah@gmail.com')
            ->setTo($vat->getEmail())
             ->setBody(
                    'Hello, ...' ,'text/')
             ->attach(\Swift_Attachment::fromPath($path));
// START send result email
    $mailer = $this->container->get('mailer');

    $listener = $this->container->get('app.service.send_email_listener');
    $listener->setPathToFile($path);
    $mailer->registerPlugin($listener);

    $mailer->send( $message );
    // END send email to admin

//unlink($path);  email will not be sent

Я пытался таким образом зарегистрировать слушателя

app.service.send_email_listener:
    class: AppBundle\Listener\SendEmailListener
    public: true
    tags:
         - { name: swiftmailer.plugin }

это класс слушателя:

namespace AppBundle\Listener;

use \Swift_Events_SendListener as base;

class SendEmailListener implements base
{
    private $pathToFile;

    public function setPathToFile($path)
    {
        $this->pathToFile = $path;
    }
    public function getPathToFile($path)
    {
        return $this->pathToFile;
    }


    /**
     * Invoked immediately before the Message is sent.
     *
     * @param \Swift_Events_SendEvent $evt
     */
    public function beforeSendPerformed(\Swift_Events_SendEvent $evt)
    {

    }

    /**
     * Invoked immediately after the Message is sent.
     *
     * @param \Swift_Events_SendEvent $evt
     */
    public function sendPerformed(\Swift_Events_SendEvent $evt)
    {
        if($this->pathToFile){
            unlink($this->pathToFile);
        }
    }
}

РЕДАКТИРОВАТЬ Выполняетсяметод, но swift не может передать файл, поскольку файл не связан до окончания отправки ... Это из dev_logs:

[2018-05-24 20:40:18] php.CRITICAL: Uncaught Exception: Unable to open file for reading [C:\Users\\projects\vat\web\vatfiles\122.txt] {"exception":"[object] (Swift_IoException(code: 0): Unable to open file for reading [C:\\Users\\\projects\\vat\\web\\vatfiles\\122.txt] at C:\\Users\\projects\\vat\\vendor\\swiftmailer\\swiftmailer\\lib\\classes\\Swift\\ByteStream\\FileByteStream.php:144)"} []

1 Ответ

0 голосов
/ 25 мая 2018

В качестве альтернативы использованию плагина Swiftmailer, я рекомендую использовать магический метод __destruct в вашем сервисе / контроллере, который использует файл (ы).__destruct вызывается при освобождении объекта и отменяет связь с любым из объявленных путей.

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class YourController extends Controller
{
    private $paths = [];

    public function someAction()
    {
         $this->paths[] = $path;
         file_put_contents($path, implode(";\r\n", $result));
         $message = (new \Swift_Message('VAT checking result !'))
            ->setFrom('vah@gmail.com')
            ->setTo($vat->getEmail())
            ->setBody('Hello, ...' ,'text/')
            ->attach(\Swift_Attachment::fromPath($path));
         $mailer = $this->container->get('mailer');
         $mailer->send( $message );

         return $this->redirectToRoute('some_route');
    }

    public function __destruct()
    {
        if ($this->paths) {
            array_map('unlink', $this->paths);
        }
    }

}

ПРИМЕЧАНИЕ. Этот подход может не работать, если вы используете катушку для отправки электронных писем., поскольку электронное письмо не будет отправлено до тех пор, пока не будут соблюдены пороговые значения для спула.


Symfony 2.3+ автоматически зарегистрирует плагин Swiftmailer, когда вы пометите службу с помощью swiftmailer.plugin.Поэтому нет необходимости звонить $mailer->registerPlugin($listener);, где swiftmailer будет просто игнорировать повторяющиеся регистрации плагинов.

...