Лично мне в Bitrix не хватает возможности отправки вложений в письмах, поэтому сделал костыль
на основе стандартной функции CEvent::SendImmediate()
Класс переопределяющий функцию CEvent::SendImmediate(),
добавлен шестой параметр - массив с описанием файлов (формат как в $_FILES)
Большая часть кода осталась стандартная
Этот код можно вставить к примеру в init.php и вместо CEvent::SendImmediate() использовать CEventWithFile::SendImmediate()
на основе стандартной функции CEvent::SendImmediate()
Класс переопределяющий функцию CEvent::SendImmediate(),
добавлен шестой параметр - массив с описанием файлов (формат как в $_FILES)
Большая часть кода осталась стандартная
Этот код можно вставить к примеру в init.php и вместо CEvent::SendImmediate() использовать CEventWithFile::SendImmediate()
class CEventWithFile extends CEvent { function SendImmediate($event, $lid, $arFields, $Duplicate = "Y", $message_id = "", $arFiles = false) { $flds = ""; if (is_array($arFields)) { foreach ($arFields as $key => $value) { if ($flds) $flds .= "&"; $flds .= CEvent::fieldencode($key) . "=" . CEvent::fieldencode($value); } } $arLocalFields = array( "EVENT_NAME" => $event, "C_FIELDS" => $flds, "LID" => is_array($lid) ? implode(",", $lid) : $lid, "DUPLICATE" => $Duplicate != "N" ? "Y" : "N", "MESSAGE_ID" => intval($message_id) > 0 ? intval($message_id) : "", "DATE_INSERT" => GetTime(time(), "FULL"), "ID" => "0", ); if ($arFiles === false) parent::HandleEvent($arLocalFields); else self::HandleEvent($arLocalFields, $arFiles); } function HandleEvent($arEvent, $arFiles = false) { global $DB; $flag = "0"; // no templates $arResult = array( "Success" => false, "Fail" => false, "Was" => false, ); $eol = CAllEvent::GetMailEOL(); $ar = CAllEvent::ExtractMailFields($arEvent["C_FIELDS"]); $arSites = explode(",", $arEvent["LID"]); foreach ($arSites as $key => $value) { $value = trim($value); if (strlen($value) > 0) $arSites[$key] = "'" . $DB->ForSql($value, 2) . "'"; else unset($arSites[$key]); } if (count($arSites) <= 0) return $flag; $strSites = implode(", ", $arSites); $strSql = "SELECT CHARSET FROM b_lang WHERE LID IN (" . $strSites . ") ORDER BY DEF DESC, SORT"; $dbCharset = $DB->Query($strSql, false, "FILE: " . __FILE__ . "<br>LINE: " . __LINE__); $arCharset = $dbCharset->Fetch(); if (!$arCharset) return $flag; $charset = $arCharset["CHARSET"]; $strWhere = ""; $MESSAGE_ID = intval($arEvent["MESSAGE_ID"]); if ($MESSAGE_ID > 0) { $strSql = "SELECT 'x' FROM b_event_message M WHERE M.ID=$MESSAGE_ID"; $z = $DB->Query($strSql); if ($z->Fetch()) $strWhere = "WHERE M.ID=$MESSAGE_ID and M.ACTIVE='Y'"; } $strSql = " SELECT DISTINCT ID FROM b_event_message M " . ($strWhere == "" ? ", b_event_message_site MS WHERE M.ID=MS.EVENT_MESSAGE_ID AND M.ACTIVE='Y' AND M.EVENT_NAME='" . $DB->ForSql($arEvent["EVENT_NAME"]) . "' AND MS.SITE_ID IN (" . $strSites . ")" : $strWhere ) . " "; $db_mail_result = $DB->Query($strSql); while ($db_mail_result_array = $db_mail_result->Fetch()) { $rsMail = $DB->Query(" SELECT ID, SUBJECT, MESSAGE, EMAIL_FROM, EMAIL_TO, BODY_TYPE, BCC, CC, REPLY_TO, IN_REPLY_TO, PRIORITY, FIELD1_NAME, FIELD1_VALUE, FIELD2_NAME, FIELD2_VALUE FROM b_event_message M WHERE M.ID = " . intval($db_mail_result_array["ID"]) . " "); $db_mail_result_array = $rsMail->Fetch(); if (!$db_mail_result_array) continue; $strSqlMLid = " SELECT MS.SITE_ID FROM b_event_message_site MS WHERE MS.EVENT_MESSAGE_ID = " . $db_mail_result_array["ID"] . " AND MS.SITE_ID IN (" . $strSites . ") "; $dbr_mlid = $DB->Query($strSqlMLid); if ($ar_mlid = $dbr_mlid->Fetch()) $arFields = $ar + CAllEvent::GetSiteFieldsArray($ar_mlid["SITE_ID"]); else $arFields = $ar + CAllEvent::GetSiteFieldsArray(false); $events = GetModuleEvents("main", "OnBeforeEventSend"); while ($event = $events->Fetch()) ExecuteModuleEventEx($event, array(&$arFields, &$db_mail_result_array)); $arMailFields = Array(); $arMailFields["From"] = CAllEvent::ReplaceTemplate($db_mail_result_array["EMAIL_FROM"], $arFields); if ($db_mail_result_array["BCC"] != '') { $bcc = CAllEvent::ReplaceTemplate($db_mail_result_array["BCC"], $arFields); if (strpos($bcc, "@") !== false) $arMailFields["BCC"] = $bcc; } if ($db_mail_result_array["CC"] != '') $arMailFields["CC"] = CAllEvent::ReplaceTemplate($db_mail_result_array["CC"], $arFields); if ($db_mail_result_array["REPLY_TO"] != '') $arMailFields["Reply-To"] = CAllEvent::ReplaceTemplate($db_mail_result_array["REPLY_TO"], $arFields); else $arMailFields["Reply-To"] = preg_replace("/(.*)\<(.*)\>/i", '$2', $arMailFields["From"]); if ($db_mail_result_array["IN_REPLY_TO"] != '') $arMailFields["In-Reply-To"] = CAllEvent::ReplaceTemplate($db_mail_result_array["IN_REPLY_TO"], $arFields); if ($db_mail_result_array['FIELD1_NAME'] != '' && $db_mail_result_array['FIELD1_VALUE'] != '') $arMailFields[$db_mail_result_array['FIELD1_NAME']] = CAllEvent::ReplaceTemplate($db_mail_result_array["FIELD1_VALUE"], $arFields); if ($db_mail_result_array['FIELD2_NAME'] != '' && $db_mail_result_array['FIELD2_VALUE'] != '') $arMailFields[$db_mail_result_array['FIELD2_NAME']] = CAllEvent::ReplaceTemplate($db_mail_result_array["FIELD2_VALUE"], $arFields); if ($db_mail_result_array["PRIORITY"] != '') $arMailFields["X-Priority"] = CAllEvent::ReplaceTemplate($db_mail_result_array["PRIORITY"], $arFields); else $arMailFields["X-Priority"] = '3 (Normal)'; foreach ($ar as $f => $v) { if (substr($f, 0, 1) == "=") $arMailFields[substr($f, 1)] = $v; } foreach ($arMailFields as $k => $v) $arMailFields[$k] = Trim($v, "\r\n"); //add those who want to receive all emails if ($arEvent["DUPLICATE"] == "Y") { $all_bcc = COption::GetOptionString("main", "all_bcc", ""); if (strpos($all_bcc, "@") !== false) $arMailFields["BCC"] .= (strlen($all_bcc) > 0 ? (strlen($arMailFields["BCC"]) > 0 ? "," : "") . $all_bcc : ""); } $email_to = CAllEvent::ReplaceTemplate($db_mail_result_array["EMAIL_TO"], $arFields); $subject = CAllEvent::ReplaceTemplate($db_mail_result_array["SUBJECT"], $arFields); if (COption::GetOptionString("main", "convert_mail_header", "Y") == "Y") { foreach ($arMailFields as $k => $v) if ($k == 'From') $arMailFields[$k] = CAllEvent::EncodeHeaderFrom($v, $charset); else $arMailFields[$k] = CAllEvent::EncodeMimeString($v, $charset); $email_to = CAllEvent::EncodeMimeString($email_to, $charset); $subject = CAllEvent::EncodeMimeString($subject, $charset); } if (defined("BX_MS_SMTP") && BX_MS_SMTP === true) { $email_to = preg_replace("/(.*)\<(.*)\>/i", '$2', $email_to); if ($arMailFields["From"] != '') $arMailFields["From"] = preg_replace("/(.*)\<(.*)\>/i", '$2', $arMailFields["From"]); if ($arMailFields["To"] != '') $arMailFields["To"] = preg_replace("/(.*)\<(.*)\>/i", '$2', $arMailFields["To"]); } if (COption::GetOptionString("main", "fill_to_mail", "N") == "Y") $arMailFields["To"] = $email_to; $boundary = "--" . md5(uniqid(time())); $header = ""; foreach ($arMailFields as $k => $v) $header .= $k . ': ' . $v . $eol; $header .= "X-MID: " . $arEvent["ID"] . "." . $db_mail_result_array["ID"] . " (" . $arEvent["DATE_INSERT"] . ")" . $eol . "X-EVENT_NAME: " . $arEvent["EVENT_NAME"] . $eol . "Content-Type: multipart/mixed; boundary=\"$boundary\"" . $eol; $bNewLineToBreak = ($db_mail_result_array["BODY_TYPE"] == "html"); $message = CAllEvent::ReplaceTemplate($db_mail_result_array["MESSAGE"], $arFields, $bNewLineToBreak); if (COption::GetOptionString("main", "send_mid", "N") == "Y") $message .= ($db_mail_result_array["BODY_TYPE"] == "html" ? "<br><br>" : "\n\n") . "MID #" . $arEvent["ID"] . "." . $db_mail_result_array["ID"] . " (" . $arEvent["DATE_INSERT"] . ")\n"; $message = str_replace("\r\n", "\n", $message); if (COption::GetOptionString("main", "CONVERT_UNIX_NEWLINE_2_WINDOWS", "N") == "Y") $message = str_replace("\n", "\r\n", $message); $multipart = "--$boundary" . $eol; $multipart .= ($db_mail_result_array["BODY_TYPE"] == "html" ? "Content-Type: text/html; charset=" . $charset . $eol : "Content-Type: text/plain; charset=" . $charset . $eol); $multipart .= "Content-Transfer-Encoding: base64" . $eol; $multipart .= $eol; $multipart .= chunk_split(base64_encode($message)); if (is_array($arFiles)) { foreach ($arFiles as $arFile) { if (intval($arFile["error"]) == 0) { $file = file_get_contents($arFile["tmp_name"]); $name = $arFile["name"]; $multipart .= $eol."--$boundary".$eol; $multipart .= "Content-Type: application/octet-stream; name=\"$name\"".$eol; $multipart .= "Content-Transfer-Encoding: base64".$eol; $multipart .= "Content-Disposition: attachment; filename=\"$name\"".$eol; $multipart .= $eol; // раздел между заголовками и телом прикрепленного файла $multipart .= chunk_split(base64_encode($file)); } } } if (defined("ONLY_EMAIL") && $email_to != ONLY_EMAIL) $arResult["Success"] = true; elseif (bxmail($email_to, $subject, $multipart, $header, COption::GetOptionString("main", "mail_additional_parameters", ""))) $arResult["Success"] = true; else $arResult["Fail"] = true; $arResult["Was"] = true; } if ($arResult["Was"]) { if ($arResult["Success"]) { if ($arResult["Fail"]) $flag = "P"; // partly sent else $flag = "Y"; // all sent } else { if ($arResult["Fail"]) $flag = "F"; // all templates failed } } return $flag; } } |