如何在PHP中设置Swift Mailer框架的回退

时间:2014-11-05 09:15:10

标签: php swiftmailer

如何为swift邮件程序设置回退,并测试我的后备代码是否正常工作? 我从howto获得了这个标准代码。

$transport = Swift_SmtpTransport::newInstance(SMTP_HOST, SMTP_PORT, 'tls')
->setUsername(SMTP_USERNAME)
->setPassword(SMTP_PASSWORD)
;

$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance('S5_Dagsrapport_' . $dato1)
->setFrom(array($from => 'S5'))
->setTo(array($to => $navn))
->setBody($body, 'text/html')
->addPart($body, 'text/html')
->attach(Swift_Attachment::newInstance($attachment, 's5_dagsreport_' . $dato1 . '.xls',          'application/xls'))
;
// Send the message
$mailer->send($message);

如果我使用

if(
$mailer->send($message)){
echo "Sent\n";
}else{
echo "Failed\n";
}

它显示已发送,但如果我将错误的信息放入参数中,则不会显示失败。 我一直在读,另一种解决方案是使用

Swift_Transport_FailoverTransport

但我无法在网上找到例子。

在Swift_mailer中实现回退的简单方法是什么,

2 个答案:

答案 0 :(得分:1)

我可以从班级Swift_Transport_FailoverTransport延伸。

https://github.com/swiftmailer/swiftmailer/blob/master/lib/classes/Swift/Transport/LoadBalancedTransport.php

包含一个名为setTransports的方法。在那里,您可以设置一个失败时使用的传输。这有点像连锁课。类本身是Swift_Transport的一个实例,它包含多个其他传输。

创建要用于连接邮件服务器的传输。然后将它们添加到Swift_Transport_FailoverTransport的实例中。然后使用该实例作为邮件传输。

答案 1 :(得分:0)

对于每个想知道如何在symfony中使用它的人,这是我的解决方案。创建一个扩展Swift_Transport_FailoverTransport的类。

namespace AppBundle\Util;

class App_Swift_Transport_FailoverTransport extends \Swift_Transport_FailoverTransport
{
    /**
     * @param \Swift_Mailer[] $mailers
     */
    public function __construct(array $mailers)
    {
        parent::__construct();

        /** @var \Swift_Mailer $mailer */
        foreach ($mailers as $mailer) {
            $this->_transports[] = $mailer->getTransport();
        }
    }
}

config.yml键下的swiftmailer中,扩展邮件范围:

swiftmailer:
    default_mailer:       default
    mailers:
        default:
            transport: 'app_failover'
        # example mailhog config 
        main:   
            disable_delivery: false
            delivery_addresses: null
            transport: smtp
            host: 127.0.0.1
            port: 1025
            username: null
            password: null
        # example for sendgrid 
        fallback:
            disable_delivery: false
            delivery_addresses: null
            encryption: 'ssl'
            transport: 'smtp'
            host: 'smtp.sendgrid.net'
            port: '465'
            username: 'apikey'
            password: 'mypassword'

最后但并非最不重要的一点是,将定义的邮件发送到App_Swift_Transport_FailoverTransport构造函数中:

swiftmailer.mailer.transport.app_failover:
    class: AppBundle\Util\App_Swift_Transport_FailoverTransport
    arguments:
        $mailers: ['@swiftmailer.mailer.main', '@swiftmailer.mailer.fallback']