Logging swiftmailer send() activity in symfony2

前端 未结 5 1155
轻奢々
轻奢々 2020-12-16 14:53

Im using swiftmailer for sending mails from my symfony2.2 project. Is there a way to log globally all email info and send results?

It would be great if mailer send

5条回答
  •  伪装坚强ぢ
    2020-12-16 15:34

    This question was answered already, This solution is better for Symfony 4 combined with Monolog. It is based on umpirsky his Answer. But without the overhead of a custom file logger.

    Note: Logs will be placed in ./var/logs/...

    App\Util\MailLoggerUtil.php

    logger = $logger;
        }
    
        /**
         * @param Swift_Events_SendEvent $evt
         */
        public function beforeSendPerformed(Swift_Events_SendEvent $evt)
        : void
        {
            // ...
        }
    
        /**
         * @param Swift_Events_SendEvent $evt
         */
        public function sendPerformed(Swift_Events_SendEvent $evt)
        : void
        {
            $level   = $this->getLogLevel($evt);
            $message = $evt->getMessage();
    
            $this->logger->log(
                $level,
                $message->getSubject().' - '.$message->getId(),
                [
                    'result'  => $evt->getResult(),
                    'subject' => $message->getSubject(),
                    'to'      => $message->getTo(),
                    'cc'      => $message->getCc(),
                    'bcc'     => $message->getBcc(),
                ]
            );
        }
    
        /**
         * @param Swift_Events_SendEvent $evt
         *
         * @return string
         */
        private function getLogLevel(Swift_Events_SendEvent $evt)
        : string
        {
            switch ($evt->getResult()) {
                // Sending has yet to occur
                case Swift_Events_SendEvent::RESULT_PENDING:
                    return LogLevel::DEBUG;
    
                // Email is spooled, ready to be sent
                case Swift_Events_SendEvent::RESULT_SPOOLED:
                    return LogLevel::DEBUG;
    
                // Sending failed
                default:
                case Swift_Events_SendEvent::RESULT_FAILED:
                    return LogLevel::CRITICAL;
    
                // Sending worked, but there were some failures
                case Swift_Events_SendEvent::RESULT_TENTATIVE:
                    return LogLevel::ERROR;
    
                // Sending was successful
                case Swift_Events_SendEvent::RESULT_SUCCESS:
                    return LogLevel::INFO;
            }
        }
    }
    

    services.yaml

    App\Util\MailLoggerUtil:
        arguments: ["@logger"]
        tags:
          - { name: monolog.logger, channel: mailer }
          - { name: "swiftmailer.default.plugin" }
    

    If you want the mailer logs to be in another channel add this:

    dev/monolog.yaml (optional)

    monolog:
        handlers:
            mailer:
                level:    debug
                type:     stream
                path:     '%kernel.logs_dir%/mailer.%kernel.environment%.log'
                channels: [mailer]
    

提交回复
热议问题