Server IP : 172.67.157.199 / Your IP : 18.191.200.108 [ Web Server : Apache System : Linux b70eb322-3aee-0c53-7c82-0db91281f2c6.secureserver.net 6.1.90-1.el9.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Thu May 2 12:09:22 EDT 2024 x86_64 User : root ( 0) PHP Version : 8.0.30.2 Disable Function : NONE Domains : 0 Domains MySQL : ON | cURL : ON | WGET : ON | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /var/www/wp-content/mu-plugins/vendor/godaddy/mwc-core/src/Email/ |
Upload File : |
<?php namespace GoDaddy\WordPress\MWC\Core\Email; use Exception; use GoDaddy\WordPress\MWC\Common\Email\Contracts\EmailContract; use GoDaddy\WordPress\MWC\Common\Email\Contracts\EmailServiceContract; use GoDaddy\WordPress\MWC\Common\Email\Exceptions\EmailSendFailedException; use GoDaddy\WordPress\MWC\Common\Events\Http\GraphQL\Request; use GoDaddy\WordPress\MWC\Common\Helpers\ArrayHelper; use GoDaddy\WordPress\MWC\Common\Http\Response; use GoDaddy\WordPress\MWC\Common\Platforms\PlatformRepositoryFactory; use GoDaddy\WordPress\MWC\Core\Events\Http\GraphQL\Queries\TemplateAsHtmlQuery; use GoDaddy\WordPress\MWC\Core\Features\EmailNotifications\Contracts\ConditionalEmailContract; use GoDaddy\WordPress\MWC\Core\Features\EmailNotifications\Contracts\DelayableEmailContract; use GoDaddy\WordPress\MWC\Core\Features\EmailNotifications\Contracts\RenderableEmailContract; /** * Email service for rendering MJML emails using a remote service and sending the resulting HTML through WordPress. */ class RemoteRenderingEmailService implements EmailServiceContract { /** * Loads the component. */ public function load() { // no-op, implements contract method } /** * Sends an email. * * @param EmailContract $email * @throws EmailSendFailedException */ public function send(EmailContract $email) { if (! $email instanceof RenderableEmailContract || $email->getBodyFormat() !== 'mjml') { throw new EmailSendFailedException(sprintf( '%1$s does not support sending emails with the %2$s content type.', static::class, $email->getContentType() )); } // @TODO: abstract this so we don't have to repeat ourselves MWC-5074 {dmagalhaes - 2022-03-24} if ($email instanceof ConditionalEmailContract && ! empty($email->getConditions())) { throw new EmailSendFailedException(sprintf( '%1$s does not support sending conditional emails.', static::class )); } if ($email instanceof DelayableEmailContract && ! empty($email->getSendAt())) { throw new EmailSendFailedException(sprintf( '%1$s does not support sending delayed emails.', static::class )); } $this->sendMjmlEmail($email); } /** * Sends a renderable email that uses an MJML template as the body. * * @param RenderableEmailContract $email the email object * @throws EmailSendFailedException */ protected function sendMjmlEmail(RenderableEmailContract $email) : void { (clone $email) ->setContentType('text/html') ->setBody($this->getBodyAsHtml($email)) ->setAltBody('') ->send(); } /** * Uses a remote service to convert the MJML body of the given email into HTML. * * @param RenderableEmailContract $email * @return string * @throws EmailSendFailedException */ protected function getBodyAsHtml(RenderableEmailContract $email) : string { try { $response = $this->buildRequest($email)->send(); } catch (Exception $exception) { throw new EmailSendFailedException($exception->getMessage(), $exception); } if ($errorMessage = $this->getResponseErrorMessage($response)) { throw new EmailSendFailedException($errorMessage); } if (! $html = ArrayHelper::get($response->getBody(), 'data.templateAsHtml.html')) { throw new EmailSendFailedException('The HTML template is missing or empty.'); } return $html; } /** * Prepares a {@see Request} object with the body and variables from the given email. * * @param RenderableEmailContract $email * @return Request * @throws Exception */ protected function buildRequest(RenderableEmailContract $email) : Request { return Request::withAuth($this->getTemplateAsHtmlQuery($email)) ->setSiteId(PlatformRepositoryFactory::getNewInstance()->getPlatformRepository()->getSiteId()); } /** * Gets the error message from a response object. * * Returns null if the response doesn't include information to indicate that an error occurred. * * @param Response $response the response object * @return string|null */ protected function getResponseErrorMessage(Response $response) : ?string { if ($response->isError()) { return $response->getErrorMessage() ?: __('Unknown error.', 'mwc-core'); } return null; } /** * Gets the corresponding GraphQL operation to query email template as HTML. * * @param RenderableEmailContract $email * @return TemplateAsHtmlQuery */ protected function getTemplateAsHtmlQuery(RenderableEmailContract $email) : TemplateAsHtmlQuery { return (new TemplateAsHtmlQuery()) ->setTemplate($email->getBody()) ->setTemplateParameters($email->getVariables()); } }