/**
  * @param MailJobInterface|SqsMailJob $mailJob
  *
  * @return bool
  */
 public function ack(MailJobInterface $mailJob)
 {
     if ($mailJob->isNewRecord()) {
         throw new InvalidCallException('SqsMailJob cannot be a new object to be acknowledged');
     }
     if ($mailJob->getDeleted()) {
         $this->getConnection()->getInstance()->deleteMessage(['QueueUrl' => $this->queueUrl, 'ReceiptHandle' => $mailJob->getReceiptHandle()]);
         return true;
     } elseif ($mailJob->getVisibilityTimeout() !== null) {
         $this->getConnection()->getInstance()->changeMessageVisibility(['QueueUrl' => $this->queueUrl, 'ReceiptHandle' => $mailJob->getReceiptHandle(), 'VisibilityTimeout' => $mailJob->getVisibilityTimeout()]);
         return true;
     }
     return false;
 }
 /**
  * 'Ack'knowledge the MailJob. Once a MailJob as been processed it could be:.
  *
  * - Updated its status to 'C'ompleted
  * - Updated its status to 'N'ew and set its `timeToSend` attribute to a future date
  *
  * @param MailJobInterface|PdoMailJob $mailJob
  *
  * @return bool
  */
 public function ack(MailJobInterface $mailJob)
 {
     if ($mailJob->isNewRecord()) {
         throw new InvalidCallException('PdoMailJob cannot be a new object to be acknowledged');
     }
     $sqlText = 'UPDATE `%s`
             SET `attempt`=:attempt, `state`=:state, `timeToSend`=:timeToSend, `sentTime`=:sentTime
             WHERE `id`=:id';
     $sql = sprintf($sqlText, $this->tableName);
     $sentTime = $mailJob->isCompleted() ? date('Y-m-d H:i:s', time()) : null;
     $query = $this->getConnection()->getInstance()->prepare($sql);
     $query->bindValue(':id', $mailJob->getId(), PDO::PARAM_INT);
     $query->bindValue(':attempt', $mailJob->getAttempt(), PDO::PARAM_INT);
     $query->bindValue(':state', $mailJob->getState());
     $query->bindValue(':timeToSend', $mailJob->getTimeToSend());
     $query->bindValue(':sentTime', $sentTime);
     return $query->execute();
 }
 /**
  * @param RedisMailJob|MailJobInterface $mailJob
  *
  * @return string
  */
 protected function createPayload(MailJobInterface $mailJob)
 {
     return json_encode(['id' => $mailJob->isNewRecord() ? sha1(Random::string(32)) : $mailJob->getId(), 'attempt' => $mailJob->getAttempt(), 'message' => $mailJob->getMessage()]);
 }