【问题标题】:Changing smtp settings in SwiftMailer dynamically动态更改 SwiftMailer 中的 smtp 设置
【发布时间】:2012-05-23 15:26:37
【问题描述】:

我在 Symfony 2 中使用 SwiftMailer 包。我在 config.yml 文件中传递了我的 smtp 用户/密码设置,效果很好,但是当我发送邮件时,我需要从数据库中获取这些设置。 我可以访问这个参数:

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

但是可以在运行时更改它们吗?我没有看到任何设置方法。 非常感谢!

【问题讨论】:

  • 我只是好奇,你是如何存储密码的?
  • @Gigala 我知道你在那里做了什么。是的,这个问题必须回答!
  • @aalaap 哈哈我的旧评论:P

标签: symfony swiftmailer


【解决方案1】:

非常感谢,但这不是我正在寻找的解决方案,根据内核请求,我不知道我将使用哪个帐户。我需要更改发送邮件循环中的设置。 我找到了很酷的解决方案:

foreach ($locations as $location) {
    // get settings for account
    $user = $location->getSmtpUser();
    $pass = $location->getSmtpPass();

    // switch to new settings
    $transport = $this->getContainer()->get('mailer')->getTransport();            
    $ext = $transport->getExtensionHandlers();
    $auth_handler = $ext[0];            
    $auth_handler->setUserName($user);
    $auth_handler->setPassword($pass);

    // send message using new settings
    $message = \Swift_Message::newInstance()
         ->setSubject( $subject )
         ->setFrom( $from )
         ->setTo( $email )
         ->setBody( $body )
         ->setContentType('text/html');

       $this->getContainer()->get('mailer')->send( $message );    
}

【讨论】:

    【解决方案2】:

    您可以创建一个kernel.request 事件监听器,注入swiftmailer.transport.real 并设置smpt info 例如

    监听类

    namespace Namespace\Of\YourListener;
    
    use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    use Symfony\Component\HttpKernel\Event\GetResponseEvent;
    
    class YourListener implements EventSubscriberInterface
    {
    
        /**
         * @var Swift_Transport_EsmtpTransport
         */
        private $transport;
    
        /**
         * @var Doctrine\ORM\EntityManager
         */
        private $em;
    
        public function __construct($transport, $em)
        {
            $this->transport = $transport;
            $this->em = $em;
        }
    
        public function onKernelRequest(GetResponseEvent $event)
        {
            //fetch info from db
            $this->transport->setHost("host");
            $this->transport->setPort("port");
            $this->transport->setUserName("username");
            $this->transport->setPassword("pass");
        }
    
        static public function getSubscribedEvents()
        {
            return array(
                KernelEvents::REQUEST => array('onKernelRequest', 0)
            );
        }
    
    }
    

    服务声明,

    your_listener:
        class: FQCN\Of\YourListener
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
        arguments: [@swiftmailer.transport.real, @doctrine.orm.entity_manager]
    

    【讨论】:

      【解决方案3】:

      我知道这有点老了,但我想得到一个答案,以防它帮助别人。我们正在使用带有 SMTP 传输的文件后台处理程序,并且需要根据站点自定义 SMTP 服务器连接。

      我们的解决方案是修改 Swiftmailer 以允许在每条消息上添加一些额外的数据,并将其绑定到 Symfony2 的事件调度程序中。这使我们能够在 spool 刷新时从每条消息中提取连接信息。

      我们将它打包成一个捆绑包,以便其他人可以使用它。你可以阅读它here

      【讨论】:

        【解决方案4】:

        其实你应该打电话给$transport->stop(); 因为在其他方式 Swift Mailer 将不会重新连接,并且在 1 个脚本执行期间将使用旧设置

        【讨论】:

        • 您好,您指的是哪个答案?谢谢!
        • 上面列出的任何一个。如果您动态更改 Swift 设置 - 您应该在应用更改后调用 stop :)
        • 你为我节省了很多时间,伙计:) 非常感谢!我尝试使用不同的身份验证设置循环发送电子邮件,并且一直收到错误Expected response code 250 but got code 553
        猜你喜欢
        • 1970-01-01
        • 2018-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多