2012-10-29 6 views
9

Napisałem niestandardowe polecenie konsoli, aby wysłać zapytanie do mojej bazy danych, wygenerować raport i wysłać wiadomość e-mail na adres; jednak nie mogę skutecznie wysłać e-maila. Mogę wysłać grzywnę e-mail z poziomu zwykłych kontrolerów w innym miejscu w mojej aplikacji, a także wysłać ją z poziomu mojej komendy konsoli, jeśli ręcznie utworzę i skonfiguruję instancję Swift_Mailer i nie otrzymam jej za pośrednictwem kontenera.Nie można wysłać wiadomości e-mail z poziomu niestandardowej komendy Symfony2, ale można to zrobić z dowolnego miejsca w aplikacji

Oto okrojona wersja polecenia mojego konsoli:

<?php 

namespace Foo\ReportBundle\Command; 

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; 
use Symfony\Component\Console\Input\InputInterface; 
use Symfony\Component\Console\Output\OutputInterface; 

class ExpiryCommand extends ContainerAwareCommand 
{ 
    protected function configure() 
    { 
     $this->setName('report:expiry') 
      ->setDescription('Compile and send e-mail listing imminent expiries'); 
    } 

    protected function execute(InputInterface $input, OutputInterface $output) 
    { 
     /* ... */ 
     $message = \Swift_Message::newInstance() 
      ->setSubject('Expiry report') 
      ->setFrom('[email protected]') 
      ->setTo('[email protected]') 
      ->setBody($body); 

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

/*  This works... 
     $transport = \Swift_SmtpTransport::newInstance('smtp.domain.com', 25) 
      ->setUsername('username') 
      ->setPassword('password'); 
     $mailer = \Swift_Mailer::newInstance($transport); 
*/ 
     $result = $mailer->send($message); 
     $output->writeln($result); 
    } 
} 

Swiftmailer jest skonfigurowany do wysyłania przez SMTP w moim pliku app/config/config.yml (delivery_address: [email protected] również ustawić w app/config/config_dev.yml):

swiftmailer: 
    transport: smtp 
    host: smtp.domain.com 
    username: username 
    password: password 
    spool: 
     type: memory 

Kiedy uruchamiając polecenie, drukuje 1 do linii poleceń, co zakładam, że to się udało. Jednak monitoruję logi mojego serwera poczty w tym samym czasie, a nawet nie łączę się.

Aby potwierdzić, że moja konfiguracja był załadowany do programu pocztowego, zmieniłem szpulę z memory do file i wiadomości są buforowane do systemu plików przy uruchamianiu komendy i mogę skutecznie przepłukać szpulę w linii poleceń z php app/console swiftmailer:spool:send .

Czy ktoś ma jakieś pomysły na temat tego, co się tutaj dzieje, lub jakiekolwiek sugestie, w jaki sposób mogę go dalej debugować? Nic nie pojawia się w moim pliku app/logs/dev.log. Używam Symfony 2.1.3-DEV.

Odpowiedz

27

Po wykopaniu niektórych kodów Symfony i SwiftMailer widzę, że bufor pamięci jest opróżniany w zdarzeniu kernel.terminate, które ma miejsce po wysłaniu odpowiedzi. Nie jestem pewien, czy działa dla poleceń, ale mogę się mylić.

Spróbuj dodać ten kod na końcu polecenia i sprawdzić, czy to pomaga:

$transport = $this->container->get('mailer')->getTransport(); 
if (!$transport instanceof \Swift_Transport_SpoolTransport) { 
    return; 
} 

$spool = $transport->getSpool(); 
if (!$spool instanceof \Swift_MemorySpool) { 
    return; 
} 

$spool->flushQueue($this->container->get('swiftmailer.transport.real')); 
+0

Ręczne spłukiwanie szpula tak wydaje się działać, Chyba 'kernel.terminate' ISN zdarzeń” t następnie uruchomione w ramach poleceń konsoli. Dzięki! – Kris

+1

Inną opcją jest wyłączenie bufora z pliku konfiguracyjnego, możesz to zrobić tylko dla wiersza poleceń. Zrobiłem to jako tymczasowe rozwiązanie (tak, tak) i to działało dla mnie. – Jens

+0

Jak zawsze świetna odpowiedź Elnur! :) – DonCallisto

2

Zamiast pamięci szpula użycie plików szpula. zmodyfikować app/config/config.yml:

swiftmailer: 
    transport: "%mailer_transport%" 
    host:  "%mailer_host%" 
    username: "%mailer_user%" 
    password: "%mailer_password%" 
    spool:  { type: file, path: %kernel.root_dir%/spool } 
-1

Wystarczy dodać to do końca swojej realizacji działania:

$container = $this->getContainer(); 
$mailer = $container->get('mailer'); 
$spool = $mailer->getTransport()->getSpool();  
$transport = $container->get('swiftmailer.transport.real'); 
$spool->flushQueue($transport); 
Powiązane problemy