动态更改SwiftMailer中的smtp设置

问题描述 投票:8回答:4

我正在使用SwiftMailer捆绑包与Symfony 2.我在config.yml文件中传递我的smtp用户/密码设置,它工作得很好,但是当我发送邮件时,我需要从数据库中取这个设置。我可以访问这个参数:

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

但是有可能在运行时更改主题吗?我没有看到任何setter方法。非常感谢!

symfony swiftmailer
4个回答
6
投票

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

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

3
投票

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

听众课

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]

2
投票

我知道这有点老了,但我希望得到一个答案,以防其他人帮助别人。我们使用带有SMTP传输的文件假脱机程序,并且需要根据站点自定义SMTP服务器连接。

我们的解决方案是修改Swiftmailer以允许在每条消息上添加一些额外的数据,并将其绑定到Symfony2的Event Dispatcher中。这允许我们在线轴刷新时从每条消息中提取连接信息。

我们把它变成了一个包,所以它可以被其他人利用。你可以读一下here


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.