使用第三方数据库假脱机时绕过假脱机

时间:2017-11-15 12:47:39

标签: database symfony swiftmailer spool

我正在使用第三方软件包(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

0 个答案:

没有答案