Лично мне в 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;
}
}
|