8

Symfony 2 で SwiftMailer バンドルを使用しています。smtp ユーザー/パスワード設定を config.yml ファイルに渡します。うまく機能しますが、メールを送信するときにデータベースからこの設定を取得する必要があります。このパラメーターにアクセスできます:

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

しかし、実行時にそれらを変更することは可能ですか? セッターメソッドが表示されません。どうもありがとう!

4

4 に答える 4

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 );    
}
于 2012-05-24T14:21:33.883 に答える
3

kernel.requestイベントリスナーを作成し、swiftmailer.transport.realSMTP情報を挿入および設定できます。

リスナークラス

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

}

サービスのデクレレーション、

your_listener:
    class: FQCN\Of\YourListener
    tags:
        - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
    arguments: [@swiftmailer.transport.real, @doctrine.orm.entity_manager]
于 2012-05-23T17:25:43.370 に答える
2

$transport->stop(); 実際、そうしないとSwift Mailer が再接続せず、1 つのスクリプト実行中に古い設定が使用されるため、呼び出す必要があります。

于 2013-12-28T18:38:36.513 に答える
2

これは少し古いことは知っていますが、他の誰かに役立つ場合に備えて答えを得たかったのです。SMTP トランスポートでファイル スプーラを使用しており、サイトに応じて SMTP サーバー接続をカスタマイズする必要がありました。

私たちの解決策は、Swiftmailer を修正して、各メッセージにいくつかの追加データを許可し、それを Symfony2 の Event Dispatcher に結び付けることでした。これにより、スプールのフラッシュ時に各メッセージから接続情報を抽出できました。

他の人が活用できるように、バンドルにしました。ここでそれについて読むことができます。

于 2013-07-12T00:11:51.890 に答える