我使用SwiftMailer捆绑包与Symfony 2.我在config.yml文件中传递我的smtp用户/密码设置,效果很好,但我需要从数据库中取出这个设置,当我发送时邮件。 我可以访问这个参数:
$mailer = $this->getContainer()->get('mailer')->getTransport();
但是可以在运行时更改它们吗?我没有看到任何setter方法。 非常感谢!
答案 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个脚本执行期间将使用旧设置