2012-05-23 40 views
7

我在Symfony 2中使用SwiftMailer包。我在config.yml文件中传递了我的smtp用户/密码设置,它工作的很好,但我需要从数据库中进行此设置,发送邮件。 我可以存取权限此PARAMS:动态更改SwiftMailer中的smtp设置

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

但有可能改变它们的运行?我没有看到任何setter方法。 非常感谢!

+1

我只是好奇,你如何存储密码使用吗? – Gigala

+0

@Gigala我看到你在那里做了什么。是的,这个问题必须得到回答! – aalaap

+0

@aalaap哈哈,我的老评论:P – Gigala

回答

3

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

Listener类

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

} 

服务decleration,

your_listener: 
    class: FQCN\Of\YourListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 
    arguments: [@swiftmailer.transport.real, @doctrine.orm.entity_manager] 
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);  
} 
2

我知道这是有点老了,但我希望得到一个答案在-情况下,它可以帮助别人。我们使用带有SMTP传输的文件假脱机程序,并且需要根据网站定制SMTP服务器连接。

我们的解决方案是修改Swiftmailer以允许每条消息的一些附加数据以及将其绑定到Symfony2的事件分派器。这使我们能够在线轴冲洗时从每条消息中提取连接信息。

我们把它做成了一个捆绑包,以便其他人可以利用它。你可以阅读关于它here

2

事实上,你应该叫$transport->stop(); 因为其他方式斯威夫特梅勒将无法重新连接和旧的设置将在1个脚本执行期间

+0

嗨你指的是哪个答案?谢谢! – Acyra

+2

以上列出的任何产品。如果您动态更改Swift设置 - 您应该在应用更改后调用停止:) –

+0

您为我的好友节省了很多时间:)非常感谢!我试图发送具有不同auth设置的循环中的电子邮件,并且始终得到错误“预期响应代码250但代码为553”。 – leealex