%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/sender/lib/integration/sender/mail/ |
Current File : //home/bitrix/www/bitrix/modules/sender/lib/integration/sender/mail/messagemail.php |
<?php /** * Bitrix Framework * @package bitrix * @subpackage sender * @copyright 2001-2012 Bitrix */ namespace Bitrix\Sender\Integration\Sender\Mail; use Bitrix\Main\Application; use Bitrix\Main\Localization\Loc; use Bitrix\Main\Config\Option; use Bitrix\Main\Result; use Bitrix\Main\Error; use Bitrix\Main\Mail; use Bitrix\Main\Web\DOM\Document; use Bitrix\Main\Loader; use Bitrix\Main\Web\DOM\StyleInliner; use Bitrix\Fileman\Block; use Bitrix\Sender\Integration; use Bitrix\Sender\Transport; use Bitrix\Sender\Message; use Bitrix\Sender\Entity; use Bitrix\Sender\Templates; use Bitrix\Sender\PostingRecipientTable; Loc::loadMessages(__FILE__); /** * Class MessageMail * @package Bitrix\Sender\Integration\Sender\Mail */ class MessageMail implements Message\iBase, Message\iMailable { const CODE = self::CODE_MAIL; /** @var Message\Configuration $configuration Configuration. */ protected $configuration; /** @var integer $configurationId Configuration ID. */ protected $configurationId; protected $closureRefCountFix; /** * MessageMail constructor. */ public function __construct() { $this->configuration = new Message\Configuration(); } /** * Get name. * * @return string */ public function getName() { return Loc::getMessage('SENDER_INTEGRATION_MAIL_MESSAGE_NAME'); } /** * Get code. * * @return string */ public function getCode() { return self::CODE; } /** * Get supported transports. * * @return array */ public function getSupportedTransports() { return array(Transport\Adapter::CODE_MAIL); } protected function setConfigurationOptions() { if ($this->configuration->hasOptions()) { return; } $this->configuration->setArrayOptions(array( array( 'type' => 'string', 'code' => 'SUBJECT', 'name' => Loc::getMessage('SENDER_INTEGRATION_MAIL_MESSAGE_CONFIG_SUBJECT'), 'required' => true, 'value' => '', 'hint' => array( 'menu' => array_map( function ($item) { return array( 'id' => '#' . $item['CODE'] . '#', 'text' => $item['NAME'], 'title' => $item['DESC'], ); }, PostingRecipientTable::getPersonalizeList() ), ), ), array( 'type' => 'mail-editor', 'code' => 'MESSAGE', 'name' => Loc::getMessage('SENDER_INTEGRATION_MAIL_MESSAGE_CONFIG_MESSAGE'), 'required' => true, 'templated' => true, 'value' => '', 'items' => array(), ), array( 'type' => 'email', 'code' => 'EMAIL_FROM', 'name' => Loc::getMessage('SENDER_INTEGRATION_MAIL_MESSAGE_CONFIG_EMAIL_FROM'), 'required' => true, 'value' => '', 'group' => Message\ConfigurationOption::GROUP_ADDITIONAL, ), array( 'type' => 'list', 'code' => 'PRIORITY', 'name' => Loc::getMessage('SENDER_INTEGRATION_MAIL_MESSAGE_CONFIG_PRIORITY'), 'required' => false, 'group' => Message\ConfigurationOption::GROUP_ADDITIONAL, 'value' => '', 'items' => array( array('code' => '', 'value' => '(' . Loc::getMessage('SENDER_INTEGRATION_MAIL_MESSAGE_NO') . ')'), array('code' => '1 (Highest)', 'value' => Loc::getMessage('SENDER_INTEGRATION_MAIL_MESSAGE_CONFIG_PRIORITY_HIGHEST')), array('code' => '3 (Normal)', 'value' => Loc::getMessage('SENDER_INTEGRATION_MAIL_MESSAGE_CONFIG_PRIORITY_NORMAL')), array('code' => '5 (Lowest)', 'value' => Loc::getMessage('SENDER_INTEGRATION_MAIL_MESSAGE_CONFIG_PRIORITY_LOWEST')), ), 'hint' => Loc::getMessage('SENDER_INTEGRATION_MAIL_MESSAGE_CONFIG_PRIORITY_HINT'), ), array( 'type' => 'string', 'code' => 'LINK_PARAMS', 'name' => Loc::getMessage('SENDER_INTEGRATION_MAIL_MESSAGE_CONFIG_LINK_PARAMS'), 'required' => false, 'group' => Message\ConfigurationOption::GROUP_ADDITIONAL, 'value' => '', 'items' => array(), ), array( 'type' => 'file', 'code' => 'ATTACHMENT', 'name' => Loc::getMessage('SENDER_INTEGRATION_MAIL_MESSAGE_CONFIG_ATTACHMENT'), 'required' => false, 'multiple' => true, 'group' => Message\ConfigurationOption::GROUP_ADDITIONAL, 'value' => '', 'items' => array(), ), )); $list = array( array( 'type' => 'template-type', 'code' => 'TEMPLATE_TYPE', 'name' => 'Template type', 'value' => '', ), array( 'type' => 'template-id', 'code' => 'TEMPLATE_ID', 'name' => 'Template id', 'value' => '', ), ); foreach ($list as $optionData) { $optionData = $optionData + array( 'type' => 'string', 'name' => '', 'internal' => true, ); $this->configuration->addOption(new Message\ConfigurationOption($optionData)); } } /** * Load configuration. * * @param string|null $id ID. * * @return Message\Configuration */ public function loadConfiguration($id = null) { $this->setConfigurationOptions(); Entity\Message::create() ->setCode($this->getCode()) ->loadConfiguration($id, $this->configuration); // do not remove: increment ref count to closure for rewriting. $instance = $this; $this->closureRefCountFix = function () use (&$instance) { return $instance->getMailBody(); }; $optionLinkParams = $this->configuration->getOption('LINK_PARAMS'); if ($optionLinkParams) { $optionLinkParams->setView( function () use ($id, $optionLinkParams) { ob_start(); $GLOBALS['APPLICATION']->IncludeComponent( 'bitrix:sender.mail.link.editor', '', array( "INPUT_NAME" => "%INPUT_NAME%", "VALUE" => $optionLinkParams->getValue(), "USE_DEFAULT" => ( !$optionLinkParams->getValue() && !$id && !Application::getInstance()->getContext()->getRequest()->isPost() ), "PLACEHOLDERS" => array( array( "code" => "campaign", "inputName" => "%INPUT_NAME_SUBJECT%" ) ), "DEFAULT_VALUE" => Option::get( 'sender', 'mail_utm', 'utm_source=newsletter&utm_medium=mail&utm_campaign=%campaign%' ) ) ); return ob_get_clean(); } ); } $optionFrom = $this->configuration->getOption('EMAIL_FROM'); if ($optionFrom) { $optionFrom->setView( function () use ($optionFrom) { ob_start(); $GLOBALS['APPLICATION']->IncludeComponent( 'bitrix:sender.mail.sender', '', array( "INPUT_NAME" => "%INPUT_NAME%", "VALUE" => $optionFrom->getValue() ) ); return ob_get_clean(); } ); } $this->configuration->set('BODY', $this->closureRefCountFix); $mailHeaders = array('Precedence' => 'bulk'); $mailHeaders = self::fillHeadersByOptionHeaders($mailHeaders); $this->configuration->set('HEADERS', $mailHeaders); return $this->configuration; } /** * Save configuration. * * @param Message\Configuration $configuration Configuration. * @return Result|null */ public function saveConfiguration(Message\Configuration $configuration) { $this->configuration = $configuration; if (Integration\Bitrix24\Service::isCloud()) { $mailBody = $this->getMailBody(); if ($mailBody && strpos($mailBody, '#UNSUBSCRIBE_LINK#') === false) { $result = new Result(); $result->addError(new Error(Loc::getMessage('SENDER_INTEGRATION_MAIL_MESSAGE_ERR_NO_UNSUB_LINK'))); return $result; } } //TODO: compare with allowed email list $emailFrom = $this->configuration->getOption('EMAIL_FROM')->getValue(); $emailFrom = (new Mail\Address($emailFrom))->get(); $this->configuration->getOption('EMAIL_FROM')->setValue($emailFrom); return Entity\Message::create() ->setCode($this->getCode()) ->saveConfiguration($this->configuration); } /** * Copy configuration. * * @param integer|string|null $id ID. * @return Result|null */ public function copyConfiguration($id) { return Entity\Message::create() ->setCode($this->getCode()) ->copyConfiguration($id); } protected function removePhp($html) { static $isCloud = null; if ($isCloud === null) { $isCloud = Integration\Bitrix24\Service::isCloud(); Loader::includeModule('fileman'); } if ($isCloud) { return Block\EditorMail::removePhpFromHtml($html); } return $html; } /** * Get main body. * * @return string */ public function getMailBody() { Loader::includeModule('fileman'); $msg = $this->configuration->getOption('MESSAGE')->getValue(); $template = $this->getTemplate(); if (!$template) { return $this->removePhp($msg); } if (!isset($template['FIELDS']) || !$template['FIELDS']['MESSAGE']['ON_DEMAND']) { return $this->removePhp($msg); } $templateHtml = null; if (isset($template['FIELDS']) && isset($template['FIELDS']['MESSAGE'])) { $templateHtml = $template['FIELDS']['MESSAGE']['VALUE']; } if (!$templateHtml && isset($template['HTML'])) { $templateHtml = $template['HTML']; } if (!$templateHtml) { return $this->removePhp($msg); } $document = new Document; $document->loadHTML($templateHtml); if(!Block\Content\Engine::create($document)->setContent($msg)->fill()) { return ''; } StyleInliner::inlineDocument($document); $msg = $document->saveHTML(); unset($document); $msg = $this->removePhp($msg); $msgTmp = Block\Editor::replaceCharset($msg, '#SENDER_MAIL_CHARSET#', true); if ($msgTmp) { $msg = $msgTmp; } if (Option::get('sender', 'use_inliner_for_each_template_mail', 'N') != 'Y') { $this->configuration->set('BODY', $msg); } return $msg; } protected function getTemplate() { if (!$this->configuration->get('TEMPLATE_TYPE') || !$this->configuration->get('TEMPLATE_ID')) { return null; } return Templates\Selector::create() ->withMessageCode(static::CODE) ->withTypeId($this->configuration->get('TEMPLATE_TYPE')) ->withId($this->configuration->get('TEMPLATE_ID')) ->get(); } protected static function fillHeadersByOptionHeaders(array $headers = array()) { static $headerList = null; if ($headerList === null) { $headerList = array(); // add headers from module options $optionHeaders = Option::get('sender', 'mail_headers', ''); $optionHeaders = !empty($optionHeaders) ? unserialize($optionHeaders) : array(); foreach ($optionHeaders as $optionHeader) { $optionHeader = trim($optionHeader); if (!$optionHeader) { continue; } $optionHeaderParts = explode(':', $optionHeader); $optionHeaderName = isset($optionHeaderParts[0]) ? $optionHeaderParts[0] : ''; $optionHeaderName = trim($optionHeaderName); $optionHeaderValue = isset($optionHeaderParts[1]) ? $optionHeaderParts[1] : ''; $optionHeaderValue = trim($optionHeaderValue); if (!$optionHeaderName || !$optionHeaderValue) { continue; } $headerList[$optionHeaderName] = $optionHeaderValue; } } foreach ($headerList as $optionHeaderName => $optionHeaderValue) { $headers[$optionHeaderName] = $optionHeaderValue; } return $headers; } }