Spaces:
No application file
No application file
namespace Mautic\EmailBundle\Event; | |
use Mautic\CoreBundle\Event\CommonEvent; | |
use Mautic\EmailBundle\Entity\Email; | |
use Mautic\EmailBundle\Helper\MailHelper; | |
use Mautic\EmailBundle\Helper\PlainTextHelper; | |
use Mautic\LeadBundle\Entity\Lead; | |
class EmailSendEvent extends CommonEvent | |
{ | |
/** | |
* @var Email|null | |
*/ | |
private $email; | |
private string $content = ''; | |
private string $plainText = ''; | |
private string $subject = ''; | |
/** | |
* @var string|null | |
*/ | |
private $idHash; | |
/** | |
* @var Lead|mixed[]|null | |
*/ | |
private $lead; | |
/** | |
* @var array | |
*/ | |
private $source; | |
private array $tokens = []; | |
/** | |
* @var bool | |
*/ | |
private $internalSend = false; | |
private array $textHeaders = []; | |
private bool $fatal = false; | |
private bool $skip = false; | |
/** | |
* @var array<string> | |
*/ | |
private array $errors = []; | |
/** | |
* @param array $args | |
* @param bool $isDynamicContentParsing | |
*/ | |
public function __construct( | |
private ?MailHelper $helper = null, | |
$args = [], | |
private $isDynamicContentParsing = false | |
) { | |
$this->content = $args['content'] ?? ''; | |
$this->plainText = $args['plainText'] ?? ''; | |
$this->subject = $args['subject'] ?? ''; | |
$this->email = $args['email'] ?? null; | |
$this->idHash = $args['idHash'] ?? null; | |
$this->lead = $args['lead'] ?? null; | |
$this->source = $args['source'] ?? []; | |
$this->tokens = $args['tokens'] ?? []; | |
$this->textHeaders = $args['textHeaders'] ?? []; | |
$this->errors = $args['errors'] ?? []; | |
$this->fatal = $args['fatal'] ?? false; | |
$this->skip = $args['skip'] ?? false; | |
if (!$this->subject && $this->email instanceof Email) { | |
$this->subject = (string) $args['email']->getSubject(); | |
} | |
if (isset($args['internalSend'])) { | |
$this->internalSend = $args['internalSend']; | |
} elseif (null !== $helper) { | |
$this->internalSend = $helper->isInternalSend(); | |
} | |
} | |
/** | |
* Check if this email is an internal send or to the lead; if an internal send, don't append lead tracking. | |
* | |
* @return bool | |
*/ | |
public function isInternalSend() | |
{ | |
return $this->internalSend; | |
} | |
/** | |
* Return if the transport and mailer is in batch mode (tokenized emails). | |
*/ | |
public function inTokenizationMode(): bool | |
{ | |
return null !== $this->helper && $this->helper->inTokenizationMode(); | |
} | |
/** | |
* Returns the Email entity. | |
* | |
* @return Email|null | |
*/ | |
public function getEmail() | |
{ | |
return (null !== $this->helper) ? $this->helper->getEmail() : $this->email; | |
} | |
/** | |
* Get email content. | |
* | |
* @return string | |
*/ | |
public function getContent($replaceTokens = false) | |
{ | |
if (null !== $this->helper) { | |
$content = $this->helper->getBody(); | |
} else { | |
$content = $this->content; | |
} | |
return ($replaceTokens) ? str_replace(array_keys($this->getTokens()), $this->getTokens(), $content) : $content; | |
} | |
/** | |
* Set email content. | |
*/ | |
public function setContent($content): void | |
{ | |
if (null !== $this->helper) { | |
$this->helper->setBody($content, 'text/html', null, true); | |
} else { | |
$this->content = $content; | |
} | |
$this->setGeneratedPlainText(); | |
} | |
/** | |
* Get email content. | |
* | |
* @return string | |
*/ | |
public function getPlainText() | |
{ | |
if (null !== $this->helper) { | |
return $this->helper->getPlainText(); | |
} else { | |
return $this->plainText; | |
} | |
} | |
public function setPlainText($content): void | |
{ | |
if (null !== $this->helper) { | |
$this->helper->setPlainText($content); | |
} else { | |
$this->plainText = $content; | |
} | |
$this->setGeneratedPlainText(); | |
} | |
/** | |
* Check if plain text is empty. If yes, generate it. | |
*/ | |
private function setGeneratedPlainText(): void | |
{ | |
$htmlContent = $this->getContent(); | |
if ('' === $this->getPlainText() && '' !== $htmlContent) { | |
$parser = new PlainTextHelper(); | |
$generatedPlainText = $parser->setHtml($htmlContent)->getText(); | |
if ('' !== $generatedPlainText) { | |
$this->setPlainText($generatedPlainText); | |
} | |
} | |
} | |
/** | |
* @return string | |
*/ | |
public function getSubject() | |
{ | |
if (null !== $this->helper) { | |
return $this->helper->getSubject(); | |
} else { | |
return $this->subject; | |
} | |
} | |
/** | |
* @param string $subject | |
*/ | |
public function setSubject($subject): void | |
{ | |
if (null !== $this->helper) { | |
$this->helper->setSubject($subject); | |
} else { | |
$this->subject = $subject; | |
} | |
} | |
/** | |
* Get the MailHelper object. | |
* | |
* @return MailHelper | |
*/ | |
public function getHelper() | |
{ | |
return $this->helper; | |
} | |
/** | |
* @return array|Lead|null | |
*/ | |
public function getLead() | |
{ | |
return (null !== $this->helper) ? $this->helper->getLead() : $this->lead; | |
} | |
/** | |
* @return string | |
*/ | |
public function getIdHash() | |
{ | |
return (null !== $this->helper) ? $this->helper->getIdHash() : $this->idHash; | |
} | |
/** | |
* @return array | |
*/ | |
public function getSource() | |
{ | |
return (null !== $this->helper) ? $this->helper->getSource() : $this->source; | |
} | |
public function addTokens(array $tokens): void | |
{ | |
$this->tokens = array_merge($this->tokens, $tokens); | |
} | |
public function addToken($key, $value): void | |
{ | |
$this->tokens[$key] = $value; | |
} | |
/** | |
* Get token array. | |
*/ | |
public function getTokens($includeGlobal = true): array | |
{ | |
$tokens = $this->tokens; | |
if ($includeGlobal && null !== $this->helper) { | |
$tokens = array_merge($this->helper->getGlobalTokens(), $tokens); | |
} | |
return $tokens; | |
} | |
public function addTextHeader($name, $value): void | |
{ | |
if (null !== $this->helper) { | |
$this->helper->addCustomHeader($name, $value); | |
} else { | |
$this->textHeaders[$name] = $value; | |
} | |
} | |
public function getTextHeaders(): array | |
{ | |
return (null !== $this->helper) ? $this->helper->getCustomHeaders() : $this->textHeaders; | |
} | |
/** | |
* Check if the listener should append it's own clickthrough in URLs or if the email tracking URL conversion process should take care of it. | |
*/ | |
public function shouldAppendClickthrough(): bool | |
{ | |
return !$this->isInternalSend() && null === $this->getEmail(); | |
} | |
/** | |
* Generate a clickthrough array for URLs. | |
*/ | |
public function generateClickthrough(): array | |
{ | |
$source = $this->getSource(); | |
$email = $this->getEmail(); | |
$clickthrough = [ | |
// what entity is sending the email? | |
'source' => $source, | |
// the email being sent to be logged in page hit if applicable | |
'email' => (null != $email) ? $email->getId() : null, | |
'stat' => $this->getIdHash(), | |
]; | |
$lead = $this->getLead(); | |
if (null !== $lead) { | |
$clickthrough['lead'] = $lead['id']; | |
} | |
return $clickthrough; | |
} | |
/** | |
* Get the content hash to note if the content has been changed. | |
* | |
* @return string | |
*/ | |
public function getContentHash() | |
{ | |
if (null !== $this->helper) { | |
return $this->helper->getContentHash(); | |
} else { | |
return md5($this->getContent().$this->getPlainText()); | |
} | |
} | |
/** | |
* @return bool | |
*/ | |
public function isDynamicContentParsing() | |
{ | |
return $this->isDynamicContentParsing; | |
} | |
public function getCombinedContent(): string | |
{ | |
$content = $this->getSubject(); | |
$content .= $this->getContent(); | |
$content .= $this->getPlainText(); | |
$content .= $this->getEmail() ? $this->getEmail()->getCustomHtml() : ''; | |
return $content.implode(' ', $this->getTextHeaders()); | |
} | |
public function disableSkip(): void | |
{ | |
$this->skip = false; | |
} | |
public function enableSkip(): void | |
{ | |
$this->skip = true; | |
} | |
public function isSkip(): bool | |
{ | |
return $this->skip; | |
} | |
public function enableFatal(): void | |
{ | |
$this->fatal = true; | |
} | |
public function disableFatal(): void | |
{ | |
$this->fatal = false; | |
} | |
public function isFatal(): bool | |
{ | |
return $this->fatal; | |
} | |
public function addError(string $error): void | |
{ | |
$this->errors[] = $error; | |
} | |
/** | |
* @return array<string> | |
*/ | |
public function getErrors(): array | |
{ | |
return $this->errors; | |
} | |
} | |