2012-05-23 29 views
7

Tôi đang sử dụng gói SwiftMailer với Symfony 2. Tôi chuyển cài đặt người dùng/mật khẩu của mình trong tệp config.yml, nó hoạt động tốt, nhưng tôi cần phải thực hiện cài đặt này từ cơ sở dữ liệu, khi tôi ' m gửi thư. Tôi có thể truy cập thông số này:Thay đổi cài đặt smtp trong SwiftMailer động

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

Nhưng có thể thay đổi chúng khi chạy không? Tôi không thấy bất kỳ phương thức setter nào. cảm ơn rất nhiều!

+1

Tôi chỉ tò mò, làm thế nào để bạn lưu trữ mật khẩu? – Gigala

+0

@Gigala Tôi thấy những gì bạn đã làm ở đó. Có, câu hỏi này phải được trả lời! – aalaap

+0

@aalaap haha ​​nhận xét cũ của tôi: P – Gigala

Trả lời

3

Bạn có thể tạo một sự kiện nghe kernel.request, bơm swiftmailer.transport.real và thiết lập thông tin SMPT ví dụ

Listener lớp

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

} 

Dịch vụ decleration,

your_listener: 
    class: FQCN\Of\YourListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 
    arguments: [@swiftmailer.transport.real, @doctrine.orm.entity_manager] 
6

Rất cám ơn, nhưng nó không phải là giải pháp tôi đang tìm kiếm, về yêu cầu hạt nhân tôi không biết tôi sẽ sử dụng tài khoản nào. Tôi cần thay đổi cài đặt bên trong vòng gửi thư của mình. Tôi thấy giải pháp khá thú vị:

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

Tôi biết điều này hơi cũ nhưng tôi muốn nhận được câu trả lời trong trường hợp giúp người khác. Chúng tôi đang sử dụng bộ đệm tệp với giao thức SMTP và cần có các kết nối máy chủ SMTP tùy chỉnh tùy thuộc vào trang web.

Giải pháp của chúng tôi là sửa đổi Swiftmailer để cho phép thêm một số dữ liệu trên mỗi thư cũng như kết hợp nó vào Trình phân phối sự kiện của Symfony2. Điều này cho phép chúng tôi trích xuất thông tin kết nối từ mỗi thông báo tại thời điểm xả ống chỉ.

Chúng tôi đã biến nó thành một nhóm để có thể được người khác tận dụng. Bạn có thể đọc về nó here.

2

Trong thực tế, bạn nên gọi $transport->stop(); bởi vì theo cách khác Swift mailer sẽ không kết nối lại và thiết lập cũ sẽ được sử dụng trong quá trình thực hiện 1 kịch bản

+0

Xin chào câu trả lời nào bạn đang đề cập đến? Cảm ơn! – Acyra

+2

bất kỳ từ được liệt kê ở trên. Nếu bạn thay đổi cài đặt Swift động - bạn nên gọi dừng sau khi áp dụng thay đổi :) –

+0

Bạn đã tiết kiệm rất nhiều thời gian cho tôi bạn thân :) Cảm ơn bạn rất nhiều! Tôi đã cố gắng gửi email trong một vòng lặp với các thiết lập auth khác nhau và đã nhận được lỗi 'Mã phản hồi dự kiến ​​250 nhưng có mã 553' tất cả các thời gian. – leealex

Các vấn đề liên quan