/** * Execute this console command to send an email * * @param InputInterface $input Command line input interface * @param OutputInterface $output Command line output interface */ public function execute(InputInterface $input, OutputInterface $output) { if (!$this->emailSender) { throw new LogicException('No email sender configured (did you set the Mandrill API key?)'); } if (!$this->emailMapper) { throw new LogicException('No email mapper configured'); } $output->writeln('Finding email by ID'); $emailId = $input->getArgument('id'); $email = $this->emailMapper->findById($emailId); if (!$email or $email->isNew()) { throw new OutOfBoundsException('Email not found.'); } $output->writeln('Sending email'); list($email, $result) = $this->emailSender->send($email); if ($email->getStatus() !== EmailEntity::STATUS_SENT) { $format = 'Email did NOT send successfully. Returned with status %s.'; $message = sprintf($format, $result['status']); if (isset($result['reject_reason'])) { $message .= ' Reason rejected: ' . $result['reject_reason']; } $output->writeln($message); return 500; } $output->writeln('Email sent successfully!'); }
/** * Create an email entity from an array and populate with default data * * @param array $data Data to populate the email * @return Email */ public function createFromArray(array $data) { $headers = json_encode(Arr::path($this->emailConfig, 'defaults.headers', [])); $defaults = ['headers' => $headers, 'sender_email' => Arr::path($this->emailConfig, 'defaults.sender.email'), 'sender_name' => Arr::path($this->emailConfig, 'defaults.sender.name')]; $email = $this->emailMapper->getPrototype(); $email = $email->exchangeArray(array_merge($defaults, $data)); $email = $this->emailMapper->persist($email); return $email; }
/** * {@inheritDoc} */ public function send(EmailEntity $email) { $time = time(); $message = $this->buildMessage($email); $result = $this->mandrill->messages->send($message); $result = array_shift($result); $email->setStatus($result['status']); $email->setSent($time); $email->setUpdated($time); $this->mapper->update($email); return [$email, $result]; }
/** * Create an email entity from an array and populate with default data * * @param array $data Data to populate the email * @return Email */ public function createFromArray(array $data) { $headers = json_encode(Arr::path($this->emailConfig, 'defaults.headers', [])); if (isset($data['sender_localpart'])) { if (!Arr::path($this->emailConfig, 'defaults.sender.domain')) { throw new \Exception('defaults.sender.domain not set in email config'); } $data['sender_email'] = Arr::remove($data, 'sender_localpart') . '@' . Arr::path($this->emailConfig, 'defaults.sender.domain'); } $defaults = ['headers' => $headers, 'sender_email' => Arr::path($this->emailConfig, 'defaults.sender.email'), 'sender_name' => Arr::path($this->emailConfig, 'defaults.sender.name')]; $email = $this->emailMapper->getPrototype(); $email = $email->exchangeArray(array_merge($defaults, $data)); $email = $this->emailMapper->persist($email); return $email; }
/** * {@inheritDoc} */ public function send(EmailEntity $email) { $time = time(); $message = $this->buildMessage($email); // Get domain from the "from" address if (!preg_match('/@(.+)$/', $email->getSenderEmail(), $matches)) { throw new \Exception("Invalid from address: {$email->getSenderEmail()}"); } $domain = $matches[1]; $result = $this->mailgun->sendMessage($domain, $message); $email->setStatus($result->http_response_code === 200 ? 'sent' : 'error'); $email->setSent($time); $email->setUpdated($time); $this->mapper->update($email); return [$email, $result]; }