Обойти спул при использовании сторонних спулингов
Я использую стороннюю связку (Dextervip Citrax\DatabaseSwiftmailerBundle
) чтобы спулинговать мою электронную почту в базе данных. Тем не менее, я все еще хочу иметь возможность обойти буферизацию для некоторых конкретных действий. Раньше, когда я не использовал пакет и использовал обычную буферизацию, я делал это следующим образом:
public function sendSeparateMessage($subject, $fromEmail, $toEmail, $toCc, $body, $bypassSpool = false){
$message = \Swift_Message::newInstance()
->setSubject($subject)
->setFrom($fromEmail)
->setTo($toEmail)
->setCc($toCc)
->setBody($body)
->setContentType("text/html");
// Send the message
$failedRecipients = [];
$numSent = 0;
foreach ($toEmail as $address => $name)
{
if (is_int($address)) {
$toEmail = $message->setTo($name);
} else {
$toEmail = $message->setTo([$address => $name]);
}
$numSent += $this->mailer->send($message, $failedRecipients);
}
if($bypassSpool) {
$spool = $this->mailer->getTransport()->getSpool();
$transport = \Swift_MailTransport::newInstance();
$spool->flushQueue($transport);
}
}
Поэтому всякий раз, когда последний параметр этой функции был установлен в true, электронные письма отправлялись немедленно и не хранились для буферизации.
Для моей ситуации сейчас я хотел бы иметь то же самое, но, конечно, я вызываю неправильную функцию flushQueue, потому что я, вероятно, не обращаюсь к нужному спулеру. Кто-нибудь знает, как получить доступ к спулеру из этого пакета?
Класс обслуживания из этого пакета:
<?php
/**
* Created by PhpStorm.
* User: Rafael
* Date: 02/05/2015
* Time: 22:16
*/
namespace Citrax\Bundle\DatabaseSwiftMailerBundle\Spool;
use Citrax\Bundle\DatabaseSwiftMailerBundle\Entity\Email;
use Citrax\Bundle\DatabaseSwiftMailerBundle\Entity\EmailRepository;
use Swift_Mime_Message;
use Swift_Transport;
class DatabaseSpool extends \Swift_ConfigurableSpool {
/**
* @var EmailRepository
*/
private $repository;
private $parameters;
public function __construct(EmailRepository $repository, $parameters)
{
$this->repository = $repository;
$this->parameters = $parameters;
}
/**
* Starts this Spool mechanism.
*/
public function start()
{
// TODO: Implement start() method.
}
/**
* Stops this Spool mechanism.
*/
public function stop()
{
// TODO: Implement stop() method.
}
/**
* Tests if this Spool mechanism has started.
*
* @return bool
*/
public function isStarted()
{
return true;
}
/**
* Queues a message.
*
* @param Swift_Mime_Message $message The message to store
*
* @return bool Whether the operation has succeeded
*/
public function queueMessage(Swift_Mime_Message $message)
{
$email = new Email();
$email->setFromEmail(implode('; ', array_keys($message->getFrom())) );
if($message->getTo() !== null ){
$email->setToEmail(implode('; ', array_keys($message->getTo())) );
}
if($message->getCc() !== null ){
$email->setCcEmail(implode('; ', array_keys($message->getCc())) );
}
if($message->getBcc() !== null ){
$email->setBccEmail(implode('; ', array_keys($message->getBcc())) );
}
if($message->getReplyTo() !== null ){
$email->setReplyToEmail(implode('; ', array_keys($message->getReplyTo())) );
}
$email->setBody($message->getBody());
$email->setSubject($message->getSubject());
$email->setMessage($message);
$this->repository->addEmail($email);
}
/**
* Sends messages using the given transport instance.
*
* @param Swift_Transport $transport A transport instance
* @param string[] $failedRecipients An array of failures by-reference
*
* @return int The number of sent emails
*/
public function flushQueue(Swift_Transport $transport, &$failedRecipients = null)
{
if (!$transport->isStarted())
{
$transport->start();
}
$count = 0;
$emails = $this->repository->getEmailQueue($this->getMessageLimit());
foreach($emails as $email){
/*@var $message \Swift_Mime_Message */
$message = $email->getMessage();
try{
$count_= $transport->send($message, $failedRecipients);
if($count_ > 0){
$this->repository->markCompleteSending($email);
$count += $count_;
}else{
throw new \Swift_SwiftException('The email was not sent.');
}
}catch(\Swift_SwiftException $ex){
$this->repository->markFailedSending($email, $ex);
}
}
return $count;
}
}
и файл services.yml:
services:
repository.email:
class: Citrax\Bundle\DatabaseSwiftMailerBundle\Entity\EmailRepository
factory: ['@doctrine.orm.default_entity_manager',getRepository]
arguments: ['CitraxDatabaseSwiftMailerBundle:Email']
citrax.database.swift_mailer.spool:
class: Citrax\Bundle\DatabaseSwiftMailerBundle\Spool\DatabaseSpool
arguments: ['@repository.email', '%citrax_database_swift_mailer.params%']
swiftmailer.spool.db:
alias: citrax.database.swift_mailer.spool
swiftmailer.mailer.default.spool.db:
alias: citrax.database.swift_mailer.spool