Как правильно подружить веб-формы с custom_mail битрикс?
Такая проблема, в init.php прописана функция
function custom_mail($to, $subject, $message, $additional_headers, $additional_parameters) {
/** @bxnolanginspection */
include_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/php_interface/class/PHPMailer/PHPMailerAutoload.php');
if (getenv('APPLICATION_ENV') === 'development') {
$mail = configurePHPMailer(
'localhost',
1025
);
Debug::writeToFile('MailHog', __FILE__ . '!!!', '/odegov.log');
}
else {
$mail = configurePHPMailer('mail.site.ru', 465);
}
$toArray = explode(',', $to);
foreach ($toArray as $t) {
$mail->AddAddress(trim($t));
}
if (!empty($additional_parameters) && mb_strpos($additional_parameters, 'BEGIN:VCALENDAR') !== false) {
$mail->AddStringAttachment($additional_parameters, 'Добавить событие в календарь.ics', 'base64',
'text/calendar; charset=utf-8; method=REQUEST');
}
/* 2018-05-03 добавление обработки для полей BCC, CC */
preg_match_all('/(.+): (.+)\n/i', $additional_headers . "\r\n", $matches);
if (is_array($matches[1]) && is_array($matches[2])) {
foreach ($matches[1] as $key => $param) {
$upper = strtoupper($param);
$value = trim($matches[2][$key]);
if ($upper === 'BCC') {
foreach (explode(',', $value) as $item) {
$mail->addBCC($item);
}
}
else if ($upper === 'CC') {
foreach (explode(',', $value) as $item) {
$mail->addCC($item);
}
}
}
}
AddMessage2Log(
'body: ' . $message . PHP_EOL
);
$mail->CharSet = 'UTF-8';
$mail->Subject = $subject;
$mail->Body = $message;
$mail->Sender = '[email protected]';
$mail->FromName = Заголовок';
$mail->From = '[email protected]';
$headers = explode("\n", $additional_headers);
$attachHeader = 'Content-Type: multipart/mixed; boundary=';
$alternateHeader = 'Content-Type: multipart/alternative; boundary=';
foreach ($headers as $h) {
if (stripos($h, $attachHeader) === 0) {
$bndr = substr($h, strlen($attachHeader));
$bndr = trim($bndr, '"');
$mail->ContentType = 'multipart/mixed; boundary="' . $bndr . '"';
}
elseif (stripos($h, $alternateHeader) === 0) {
Mail::processingMessage($mail);
}
}
if (!$result = $mail->Send()) {
AddMessage2Log(
'Ошибка отправки: ' . $mail->ErrorInfo . PHP_EOL
);
$mail = configurePHPMailer('mail2.site.ru', 465, $mail);
$result = $mail->Send();
if (!$result) {
AddMessage2Log(
'Ошибка отправки2: ' . $mail->ErrorInfo . PHP_EOL
);
}
}
return $result;
}
Проблема в том что, когда идет запись через веб-формы, то почта не отправляется вообще никому (ни тому кто заполнил, ни администратору сайта) через sql стоят SUCCESS_EXEC F, проверил все стандартные методы, помогает только удаление данной функции, но как я понял smtp тогда отключается и всё идёт в спам. А остальные формы которые не через веб-форму стабильно идут. Как мне записать так чтобы и при оформлении веб-формы письма тоже летали
Ответы (1 шт):
Одна из стандартных ошибок при отправке почты - использовать переменную окружения $_SERVER. Когда отправка почты идёт через cron, такая переменная окружения отсутствует. Поэтому, добавляем в начало функции:
if(!isset($_SERVER['DOCUMENT_ROOT'])){
$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/../..");
}
Почему идут остальные, не веб-формы? Могу предположить, что для них отправка почты идёт через CEvent::SendImmediate().