1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
eventmessagecompiler.php
См. документацию.
1<?php
2
9
10namespace Bitrix\Main\Mail;
11
12use Bitrix\Main\Localization\Loc;
13use Bitrix\Main\Mail\Internal as MailInternal;
14use Bitrix\Main\Config as Config;
15
17{
18 protected $mailTo;
19 protected $mailHeaders;
20 protected $mailSubject;
21 protected $mailBody;
22 protected $mailCharset;
23 protected $mailId;
25 protected $mailAttachment;
26 protected $eventMessageId = null;
27 protected $event = [];
29 protected $eventFields;
30 protected $siteFields;
31 protected $siteId;
32 protected $languageId;
34
35 /*
36 * 'MESSAGE' = array(
37 'BODY_TYPE' => 'html',
38 'SUBJECT' => '',
39 'EMAIL_TO' => '',
40 'EMAIL_FROM' => '',
41 'MESSAGE' => '',
42 'ID' => '',
43 'DATE_INSERT' => '',
44 'SITE_TEMPLATE_ID' => '',
45 'BCC' => '',
46 'CC' => '',
47 'REPLY_TO' => '',
48 'IN_REPLY_TO' => '',
49 'PRIORITY' => '',
50 'ADDITIONAL_FIELD' => array(),
51 'FILE' => array(),
52 )
53 */
54 public function __construct(array $arMessageParams)
55 {
56 if (!array_key_exists('FIELDS', $arMessageParams))
57 {
58 throw new \Bitrix\Main\ArgumentTypeException("FIELDS");
59 }
60 if (!array_key_exists('MESSAGE', $arMessageParams))
61 {
62 throw new \Bitrix\Main\ArgumentTypeException("MESSAGE");
63 }
64 if (!array_key_exists('SITE', $arMessageParams))
65 {
66 throw new \Bitrix\Main\ArgumentTypeException("SITE");
67 }
68 if (!array_key_exists('CHARSET', $arMessageParams))
69 {
70 throw new \Bitrix\Main\ArgumentTypeException("CHARSET");
71 }
72
73 $this->eventFields = $arMessageParams['FIELDS'];
74 if (array_key_exists('EVENT', $arMessageParams))
75 {
76 $this->event = $arMessageParams['EVENT'];
77 $this->languageId = $this->event['LANGUAGE_ID'] ?? null;
78 }
79
80 $this->eventMessageFields = $arMessageParams['MESSAGE'];
81 if (array_key_exists('ID', $arMessageParams['MESSAGE']))
82 {
83 $this->eventMessageId = $arMessageParams['MESSAGE']['ID'];
84 }
85
86 $this->siteFields = $this->getSiteFieldsArray(
87 is_array($arMessageParams['SITE'])
88 ? $arMessageParams['SITE']
89 : [$arMessageParams['SITE']]
90 );
91 $this->eventSiteFields = array_merge($this->siteFields, $this->eventFields);
92 foreach ($this->eventSiteFields as $k => $v)
93 {
94 $this->eventSiteFields[$k] = static::getFieldFlatValue($v);
95 }
96 $this->setMailCharset($arMessageParams['CHARSET']);
97 }
98
102 public static function createInstance(array $arMessageParams)
103 {
104 return new static($arMessageParams);
105 }
106
110 public function compile()
111 {
112 $this->setMailHeaders();
113
114 $this->setMailId();
115 $this->setMailContentType();
116
117 $this->setMailTo();
118 $this->setMailSubject();
119 $this->setMailBody();
120 $this->setMailAttachment();
121 }
122
126 protected function setMailBody()
127 {
128 $isHtml = $this->eventMessageFields["BODY_TYPE"] == "html";
129
130 // replace placeholders in body
131 $message = $this->eventMessageFields["MESSAGE_PHP"];
132 if (empty($message) && !empty($this->eventMessageFields["MESSAGE"]))
133 {
134 $message = MailInternal\EventMessageTable::replaceTemplateToPhp($this->eventMessageFields["MESSAGE"]);
135 if ($this->eventMessageFields["ID"] > 0)
136 {
137 MailInternal\EventMessageTable::update($this->eventMessageFields["ID"], ['MESSAGE_PHP' => $message]);
138 }
139 }
140
141 if (!empty($this->eventMessageFields['SITE_TEMPLATE_ID']))
142 {
143 $siteTemplateId = $this->eventMessageFields['SITE_TEMPLATE_ID'];
144 }
145 else
146 {
147 $siteTemplateId = null;
148 }
149
150 $themeCompiler = EventMessageThemeCompiler::createInstance($siteTemplateId, $message, $isHtml);
151
152 if (empty($siteTemplateId))
153 {
154 $siteTemplateId = ".default";
155 }
156
157 // set context variables for components
158 $themeCompiler->setSiteTemplateId($siteTemplateId);
159 $themeCompiler->setSiteId($this->siteId);
160 $themeCompiler->setLanguageId($this->languageId);
161 Loc::setCurrentLang($themeCompiler->getLanguageId());
162
163 // set values of $arParams, used by components
165 if ($isHtml)
166 {
167 foreach ($this->eventSiteFields as $fieldKey => $fieldValue)
168 {
169 $eventSiteFields["HTML_" . $fieldKey] = nl2br(htmlspecialcharsbx($fieldValue, ENT_COMPAT, false));
170
171 if (!str_contains($fieldValue, "<"))
172 {
173 $eventSiteFields[$fieldKey] = nl2br($fieldValue);
174 }
175 }
176 }
177 $eventSiteFields['MAIL_EVENTS_UNSUBSCRIBE_LINK'] = Tracking::getLinkUnsub(
178 'main',
179 [
180 'CODE' => mb_strtolower(trim(explode(',', $this->getMailTo())[0])),
181 'EVENT_NAME' => $this->eventMessageFields["EVENT_NAME"],
182 ]
183 );
184 $themeCompiler->setParams($eventSiteFields);
185 // eval site template and body
186 $themeCompiler->execute();
187 // get eval result of site template and body
188 $message = $themeCompiler->getResult();
189
190 $this->mailBody = $message;
191
192 Loc::setCurrentLang(null);
194 }
195
199 public function getMailBody()
200 {
201 return $this->mailBody;
202 }
203
207 protected function setMailCharset($mailCharset)
208 {
209 $this->mailCharset = $mailCharset;
210 }
211
215 public function getMailCharset()
216 {
217 return $this->mailCharset;
218 }
219
223 protected function setMailContentType()
224 {
225 $this->mailContentType = $this->eventMessageFields["BODY_TYPE"];
226 }
227
231 public function getMailContentType()
232 {
234 }
235
236 protected function setMailAttachment()
237 {
238 $eventMessageAttachment = [];
239 $eventFilesContent = [];
240
241 // Attach files from message template
242 if (array_key_exists('FILE', $this->eventMessageFields))
243 {
244 $eventMessageAttachment = $this->eventMessageFields["FILE"];
245 }
246
247 if (array_key_exists('FILES_CONTENT', $this->event))
248 {
249 $eventFilesContent = $this->event["FILES_CONTENT"];
250 }
251
252 // Attach files from event
253 if (isset($this->event["FILE"]) && is_array($this->event["FILE"]))
254 {
255 $eventFileList = [];
256 foreach ($this->event["FILE"] as $fileId)
257 {
258 if (is_numeric($fileId))
259 {
260 $eventFileList[] = $fileId;
261 }
262 }
263
264 $eventMessageAttachment = array_merge($eventMessageAttachment, $eventFileList);
265 }
266
267 if (!empty($eventMessageAttachment))
268 {
269 $attachFileList = [];
270 $eventMessageAttachment = array_unique($eventMessageAttachment);
271
272 $strId = implode(',', $eventMessageAttachment);
274 $strSql = "SELECT * FROM b_file WHERE ID IN(" . $strId . ")";
275 $resultDb = $conn->query($strSql);
276 while ($file = $resultDb->fetch())
277 {
278 $tempFile = \CFile::MakeFileArray($file["ID"]);
279 $attachFileList[] = [
280 'PATH' => $tempFile['tmp_name'],
281 'ID' => $file['ID'],
282 'CONTENT_TYPE' => $file['CONTENT_TYPE'],
283 'NAME' => ($file['ORIGINAL_NAME'] <> "" ? $file['ORIGINAL_NAME'] : $file['FILE_NAME']),
284 ];
285 }
286
287 $this->mailAttachment = $attachFileList;
288 }
289
290 if (!empty($eventFilesContent))
291 {
292 foreach ($eventFilesContent as $item)
293 {
294 $this->mailAttachment[] = [
295 'CONTENT_TYPE' => $item['CONTENT_TYPE'],
296 'NAME' => $item['NAME'],
297 'CONTENT' => $item['CONTENT'],
298 'ID' => $item['ID'],
299 'CHARSET' => $item['CHARSET'],
300 'METHOD' => $item['METHOD'],
301 ];
302 }
303 }
304 }
305
309 public function getMailAttachment()
310 {
312 }
313
317 protected function setMailHeaders()
318 {
319 $arMailFields = [];
321 $arFields = $this->eventFields + $this->siteFields;
322
323 $arMailFields["From"] = $this->replaceTemplate($messageFields["EMAIL_FROM"], $arFields);
324
325 if (isset($messageFields["BCC"]) && $messageFields["BCC"] != '')
326 {
327 $bcc = $this->replaceTemplate($messageFields["BCC"], $arFields);
328 if (str_contains($bcc, "@"))
329 {
330 $arMailFields["BCC"] = $bcc;
331 }
332 }
333
334 if (isset($messageFields["CC"]) && $messageFields["CC"] != '')
335 {
336 $arMailFields["CC"] = $this->replaceTemplate($messageFields["CC"], $arFields);
337 }
338
339 if (isset($messageFields["REPLY_TO"]) && $messageFields["REPLY_TO"] != '')
340 {
341 $arMailFields["Reply-To"] = $this->replaceTemplate($messageFields["REPLY_TO"], $arFields);
342 }
343 else
344 {
345 $arMailFields["Reply-To"] = preg_replace("/(.*)\\<(.*)\\>/i", '$2', $arMailFields["From"]);
346 }
347
348 if (isset($messageFields["IN_REPLY_TO"]) && $messageFields["IN_REPLY_TO"] != '')
349 {
350 $arMailFields["In-Reply-To"] = $this->replaceTemplate($messageFields["IN_REPLY_TO"], $arFields);
351 }
352
353 if (isset($messageFields["ADDITIONAL_FIELD"]) && is_array($messageFields['ADDITIONAL_FIELD']))
354 {
355 foreach ($messageFields['ADDITIONAL_FIELD'] as $additionalField)
356 {
357 $arMailFields[$additionalField['NAME']] = static::replaceTemplate($additionalField['VALUE'], $arFields);
358 }
359 }
360
361 if (isset($messageFields["PRIORITY"]) && $messageFields["PRIORITY"] != '')
362 {
363 $arMailFields["X-Priority"] = $this->replaceTemplate($messageFields["PRIORITY"], $arFields);
364 }
365
366 foreach ($arFields as $f => $v)
367 {
368 if (str_starts_with($f, "="))
369 {
370 $arMailFields[substr($f, 1)] = $v;
371 }
372 }
373
374 foreach ($arMailFields as $k => $v)
375 {
376 $arMailFields[$k] = trim($v, "\r\n");
377 }
378
379 //add those who want to receive all emails
380 if (isset($this->event["DUPLICATE"]) && $this->event["DUPLICATE"] == "Y")
381 {
382 $all_bcc = Config\Option::get("main", "all_bcc");
383 if (str_contains($all_bcc, "@"))
384 {
385 $arMailFields["BCC"] .= ($all_bcc <> '' ? ($arMailFields["BCC"] <> '' ? "," : "") . $all_bcc : "");
386 }
387 }
388
389 if (isset($this->event["EVENT_NAME"]))
390 {
391 $arMailFields['X-EVENT_NAME'] = $this->event["EVENT_NAME"];
392 }
393
394 $this->mailHeaders = $arMailFields;
395 }
396
400 public function getMailHeaders()
401 {
402 return $this->mailHeaders;
403 }
404
408 protected function setMailId()
409 {
410 if (isset($this->event['ID']) && isset($this->eventMessageFields["ID"]))
411 {
412 $this->mailId = $this->event['ID'] . "." . $this->eventMessageFields["ID"] . " (" . $this->event["DATE_INSERT"] . ")";
413 }
414 else
415 {
416 $this->mailId = '';
417 }
418 }
419
423 public function getMailId()
424 {
425 return $this->mailId;
426 }
427
431 protected function setMailSubject()
432 {
433 $this->mailSubject = $this->replaceTemplate($this->eventMessageFields["SUBJECT"], $this->eventSiteFields);
434 }
435
439 public function getMailSubject()
440 {
441 return $this->mailSubject;
442 }
443
447 protected function setMailTo()
448 {
449 $this->mailTo = $this->replaceTemplate($this->eventMessageFields["EMAIL_TO"], $this->eventSiteFields);
450 }
451
455 public function getMailTo()
456 {
457 return $this->mailTo;
458 }
459
466 protected function replaceTemplate($str, $ar, $bNewLineToBreak = false)
467 {
468 $str = str_replace("%", "%2", $str);
469
470 foreach ($ar as $key => $val)
471 {
472 if (is_array($val))
473 {
474 $val = implode(', ', $val);
475 }
476
477 if ($bNewLineToBreak && !str_contains($val, "<"))
478 {
479 $val = nl2br($val);
480 }
481
482 $val = str_replace("%", "%2", $val);
483 $val = str_replace("#", "%1", $val);
484 $str = str_replace("#" . $key . "#", $val, $str);
485 }
486
487 $str = str_replace("%1", "#", $str);
488 $str = str_replace("%2", "%", $str);
489
490 return $str;
491 }
492
499 protected function getSiteFieldsArray($sites)
500 {
501 $site_id = $sites[0];
502
503 if (!empty($this->eventMessageId))
504 {
505 $messageSiteDb = MailInternal\EventMessageSiteTable::getList([
506 'select' => ['SITE_ID'],
507 'filter' => [
508 '=EVENT_MESSAGE_ID' => $this->eventMessageId,
509 '=SITE_ID' => $sites,
510 ],
511 ]);
512 if ($arMessageSite = $messageSiteDb->Fetch())
513 {
514 $site_id = $arMessageSite['SITE_ID'];
515 }
516 }
517
518 $globalName = $GLOBALS["SERVER_NAME"] ?? '';
519 $SITE_NAME = Config\Option::get("main", "site_name", $globalName);
520 $SERVER_NAME = Config\Option::get("main", "server_name", $globalName);
521 $DEFAULT_EMAIL_FROM = Config\Option::get("main", "email_from", "admin@" . $globalName);
522
523 if ($site_id <> '')
524 {
526 if ($arSite = $result->fetch())
527 {
528 $this->siteId = $arSite['LID'];
529 if ($this->languageId === null)
530 {
531 $this->languageId = $arSite['LANGUAGE_ID'];
532 }
533
534 \CEvent::$EVENT_SITE_PARAMS[$site_id] = [
535 "SITE_NAME" => ($arSite["SITE_NAME"] <> '' ? $arSite["SITE_NAME"] : $SITE_NAME),
536 "SERVER_NAME" => ($arSite["SERVER_NAME"] <> '' ? $arSite["SERVER_NAME"] : $SERVER_NAME),
537 "DEFAULT_EMAIL_FROM" => ($arSite["EMAIL"] <> '' ? $arSite["EMAIL"] : $DEFAULT_EMAIL_FROM),
538 "LANGUAGE_ID" => $arSite['LANGUAGE_ID'],
539 "SITE_ID" => $arSite['LID'],
540 "SITE_DIR" => $arSite['DIR'],
541 ];
542 return \CEvent::$EVENT_SITE_PARAMS[$site_id];
543 }
544 }
545
546 return [
547 "SITE_NAME" => $SITE_NAME,
548 "SERVER_NAME" => $SERVER_NAME,
549 "DEFAULT_EMAIL_FROM" => $DEFAULT_EMAIL_FROM,
550 ];
551 }
552
557 protected static function getFieldFlatValue($value)
558 {
559 $flatValue = '';
560 if (is_array($value))
561 {
562 foreach ($value as $v)
563 {
564 $flatValue .= ($flatValue <> '' ? ', ' : '') . static::getFieldFlatValue($v);
565 }
566 }
567 else
568 {
569 $flatValue = $value;
570 }
571
572 return $flatValue;
573 }
574
578 public function toString()
579 {
580 $result = '';
581 $delimeter = str_repeat('-', 5);
582
583 $result .= $delimeter . "CHARSET" . $delimeter . "\n" . $this->getMailCharset() . "\n\n";
584 $result .= $delimeter . "CONTENT_TYPE" . $delimeter . "\n" . $this->getMailContentType() . "\n\n";
585 $result .= $delimeter . "MESSAGE_ID" . $delimeter . "\n" . $this->getMailId() . "\n\n";
586 $result .= $delimeter . "TO" . $delimeter . "\n" . $this->getMailTo() . "\n\n";
587 $result .= $delimeter . "SUBJECT" . $delimeter . "\n" . $this->getMailSubject() . "\n\n";
588 $result .= $delimeter . "HEADERS" . $delimeter . "\n" . print_r($this->getMailHeaders(), true) . "\n\n";
589 $result .= $delimeter . "BODY" . $delimeter . "\n" . $this->getMailBody() . "\n\n";
590 $result .= $delimeter . "ATTACHMENT" . $delimeter . "\n" . print_r($this->getMailAttachment(), true) . "\n\n";
591
592 return $result;
593 }
594}
$messageFields
Определения callback_ednaru.php:22
static getConnection($name="")
Определения application.php:638
static get($moduleId, $name, $default="", $siteId=false)
Определения option.php:30
static createInstance(array $arMessageParams)
Определения eventmessagecompiler.php:102
__construct(array $arMessageParams)
Определения eventmessagecompiler.php:54
replaceTemplate($str, $ar, $bNewLineToBreak=false)
Определения eventmessagecompiler.php:466
static createInstance($siteTemplateId=null, $body, $isHtml=true)
Определения eventmessagethemecompiler.php:62
static getLinkUnsub($moduleId, $fields, $urlPage=null)
Определения tracking.php:148
static getById($id)
Определения datamanager.php:364
$sites
Определения clear_component_cache.php:15
$str
Определения commerceml2.php:63
$f
Определения component_props.php:52
$arFields
Определения dblapprove.php:5
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
$GLOBALS['____1690880296']
Определения license.php:1
$message
Определения payment.php:8
$ar
Определения options.php:199
if(empty($signedUserToken)) $key
Определения quickway.php:257
$val
Определения options.php:1793
$site_id
Определения sonet_set_content_view.php:9
$k
Определения template_pdf.php:567