动态更改SwiftMailer中的smtp设置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态更改SwiftMailer中的smtp设置相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

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 );    
}
另一答案

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

听众课

namespace NamespaceOfYourListener;

use SymfonyComponentEventDispatcherEventSubscriberInterface;
use SymfonyComponentHttpKernelEventGetResponseEvent;

class YourListener implements EventSubscriberInterface
{

    /**
     * @var Swift_Transport_EsmtpTransport
     */
    private $transport;

    /**
     * @var DoctrineORMEntityManager
     */
    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: FQCNOfYourListener
    tags:
        - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
    arguments: [@swiftmailer.transport.real, @doctrine.orm.entity_manager]
另一答案

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

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

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

另一答案

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

以上是关于动态更改SwiftMailer中的smtp设置的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 使用 STARTTLS 和自签名证书的 Swiftmailer

将 Gmail 用于 SMTP 时,您可以设置不同的“发件人”地址吗?

Swiftmailer不立即发送

Swiftmailer 在分期后崩溃

尝试使用 swift mailer、gmail smtp、php 发送邮件

使用 Swiftmailer 时如何设置回复