动态更改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 时,您可以设置不同的“发件人”地址吗?