动态更改SwiftMailer中的smtp设置

时间:2012-05-23 15:26:38

标签: symfony swiftmailer

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

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

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

4 个答案:

答案 0 :(得分: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 );    
}

答案 1 :(得分:3)

您可以创建kernel.request事件侦听器,注入swiftmailer.transport.real并设置smtp信息,例如

听众类

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

}

服务声明,

答案 2 :(得分:2)

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

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

我们把它变成了捆绑,所以它可以被其他人利用。你可以阅读它here

答案 3 :(得分:2)

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