コード例 #1
0
 public static function ExtractEmail($str)
 {
     if (!(IsModuleInstalled('mail') && CModule::IncludeModule('mail'))) {
         $result = self::ParseEmail($str);
         return $result['EMAIL'];
     }
     return CMailUtil::ExtractMailAddress($str);
 }
コード例 #2
0
ファイル: smtp.php プロジェクト: Satariall/izurit
 function __ProcessCommand($command, $arg = '')
 {
     switch (strtoupper($command)) {
         case "HELO":
             $this->Send('250', 'domain name should be qualified');
             if (trim($arg) == '') {
                 $this->host = $this->ip;
             } else {
                 $this->host = $arg;
             }
             //500, 501, 504, 421
             break;
         case "SEND":
         case "SOML":
         case "SAML":
         case "MAIL":
             if (!preg_match('#FROM[ ]*:[ ]*(.+)#i', $arg, $arMatches)) {
                 $this->Send('501', 'Unrecognized parameter ' . $arg);
             } elseif ($this->arMsg["FROM"]) {
                 $this->Send('503', 'Sender already specified');
             } else {
                 $email = $arMatches[1];
                 $email = CMailUtil::ExtractMailAddress($email);
                 if ($email == '' || !check_email($email)) {
                     $this->Send('501', '<' . $email . '> Invalid Address');
                 } else {
                     $this->arMsg["FROM"] = $email;
                     $this->arMsg["TO"] = array();
                     $this->Send('250', '<' . $email . '> Sender ok');
                 }
             }
             //F: 552, 451, 452
             //E: 500, 501, 421
             break;
         case "RCPT":
             if (!preg_match('#TO[ ]*:[ ]*(.+)#i', $arg, $arMatches)) {
                 $this->Send('501', 'Unrecognized parameter ' . $arg);
             } else {
                 $email = $arMatches[1];
                 $email = CMailUtil::ExtractMailAddress($email);
                 if ($email == '' || !check_email($email)) {
                     $this->Send('501', '<' . $email . '> Invalid Address');
                 } elseif (false) {
                     $this->Send('550', '<' . $email . '> User unknown');
                 } elseif (!$this->CheckRelaying($email)) {
                     $this->Send('550', '<' . $email . '>... Relaying denied.');
                 } elseif (!$this->arMsg["FROM"]) {
                     $this->Send('503', 'Sender is not specified');
                 } else {
                     $this->arMsg["TO"][] = $email;
                     $this->Send('250', '<' . $email . '> ok');
                     //S: 250, 251
                     //F: 550, 551, 552, 553, 450, 451, 452
                     //E: 500, 501, 503, 421
                 }
             }
             break;
         case "DATA":
             if (!$this->arMsg["FROM"] || !$this->arMsg["TO"] || count($this->arMsg["TO"]) == 0) {
                 $this->Send('503');
             } else {
                 $this->Send('354');
                 $this->__listenFunc = '__DataHandler';
             }
             // I: 354 -> data -> S: 250
             //                      F: 552, 554, 451, 452
             //   F: 451, 554
             //   E: 500, 501, 503, 421
             break;
         case "RSET":
             $this->Send('250', 'Resetting');
             $this->arMsg = array('LOCAL_ID' => md5(uniqid()));
             //E: 500, 501, 504, 421
             break;
         case "QUIT":
             $this->Send('221');
             $this->Disconnect();
             //E: 500
             break;
         case "EHLO":
             if (trim($arg) == '') {
                 $this->host = $this->ip;
             } else {
                 $this->host = $arg;
             }
             $this->Send('250-ehlo', '');
             $this->Send('250-AUTH LOGIN PLAIN', '');
             //$this->Send('250-SIZE', '');
             $this->Send('250-HELP', '');
             $this->Send('250', 'EHLO');
             /*
             250-mail.company2.tld is pleased to meet you
             250-DSN
             250-SIZE
             250-STARTTLS
             250-AUTH LOGIN PLAIN CRAM-MD5 DIGEST-MD5 GSSAPI MSN NTLM
             250-ETRN
             250-TURN
             250-ATRN
             250-NO-SOLICITING
             250-HELP
             250-PIPELINING
             250 EHLO
             */
             break;
         case "AUTH":
             if ($this->authorized) {
                 $this->Send('503', 'Already authorized');
             } elseif (count($this->arMsg) > 1) {
                 $this->Send('503', 'Mail transaction is active');
             } elseif (!preg_match('#^([A-Z0-9-_]+)[ ]*(\\S*)$#i', $arg, $arMatches)) {
                 $this->Send('501', 'Unrecognized parameter ' . $arg);
             } else {
                 switch (strtoupper($arMatches[1])) {
                     case "LOGIN":
                         $this->Send('334', 'VXNlcm5hbWU6');
                         $this->__listenFunc = '__AuthLoginHandler';
                         $this->__login = false;
                         break;
                     case "PLAIN":
                         if ($arMatches[2] && trim($arMatches[2]) != '') {
                             $pwd = base64_decode($arMatches[2]);
                             $this->Authorize($pwd, $pwd);
                         } else {
                             $this->Send('334', '');
                             $this->__listenFunc = '__AuthPlainHandler';
                         }
                         break;
                     default:
                         $this->Send('504', 'Unrecognized authentication type.');
                 }
             }
             break;
         case "NOOP":
             $this->Send('250');
             //E: 500, 421
             break;
         case "HELP":
             //       S: 211, 214
             //       E: 500, 501, 502, 504, 421
             break;
         case "EXPN":
             //<string>
             //       S: 250
             //       F: 550
             //       E: 500, 501, 502, 504, 421
             break;
         case "VRFY":
             //       S: 250, 251
             //       F: 550, 551, 553
             //       E: 500, 501, 502, 504, 421
             break;
         default:
             $this->Send('500', $command . ' command unrecognized');
     }
     return true;
 }
コード例 #3
0
ファイル: email.php プロジェクト: mrdeadmouse/u136006
 function EMailMessageAdd($arMessageFields, $ACTION_VARS)
 {
     $arActionVars = explode("&", $ACTION_VARS);
     $countAr = count($arActionVars);
     for ($i = 0; $i < $countAr; $i++) {
         $v = $arActionVars[$i];
         if ($pos = strpos($v, "=")) {
             ${substr($v, 0, $pos)} = urldecode(substr($v, $pos + 1));
         }
     }
     if (!CModule::IncludeModule("support")) {
         return false;
     }
     if (strlen($W_SUPPORT_SITE_ID) > 0) {
         $rs = CSite::GetByID($W_SUPPORT_SITE_ID);
         if ($ar = $rs->Fetch()) {
             $SITE_ID = $ar["LID"];
         }
     }
     if (strlen($SITE_ID) <= 0) {
         $SITE_ID = $arMessageFields["LID"];
     }
     $sourceMail = COption::GetOptionString("support", "SOURCE_MAIL");
     $dbr = CTicketDictionary::GetBySID($sourceMail, "SR", $SITE_ID);
     if (!($ar = $dbr->Fetch())) {
         return false;
     }
     $TICKET_SOURCE_ID = $ar["ID"];
     $ID = $arMessageFields["ID"];
     $message_email = strlen($arMessageFields["FIELD_REPLY_TO"]) > 0 ? $arMessageFields["FIELD_REPLY_TO"] : $arMessageFields["FIELD_FROM"];
     $message_email_addr = strtolower(CMailUtil::ExtractMailAddress($message_email));
     $TID = 0;
     $arSubjects = explode("\n", trim($W_SUPPORT_SUBJECT));
     $countAr = count($arSubjects);
     for ($i = 0; $i < $countAr; $i++) {
         $arSubjects[$i] = Trim($arSubjects[$i]);
         if (strlen($arSubjects[$i]) > 0) {
             if (preg_match("/" . $arSubjects[$i] . "/" . BX_UTF_PCRE_MODIFIER, $arMessageFields["SUBJECT"], $regs)) {
                 $TID = IntVal($regs[1]);
                 break;
             }
         }
     }
     if ($TID > 0) {
         $db_ticket = CTicket::GetByID($TID, $SITE_ID, "N", "N", "N");
         if ($ar_ticket = $db_ticket->Fetch()) {
             //check user email address limits
             if ($W_SUPPORT_SEC == "domain" || $W_SUPPORT_SEC == "email") {
                 $bEMailOK = false;
                 if ($TICKET_SOURCE_ID == $ar_ticket["SOURCE_ID"]) {
                     $ticket_email = strtolower(CMailUtil::ExtractMailAddress($ar_ticket["OWNER_SID"]));
                     if ($W_SUPPORT_SEC == "domain") {
                         $ticket_email = substr($ticket_email, strpos($ticket_email, "@"));
                     }
                     if (strpos($message_email_addr, $ticket_email) !== false) {
                         $bEMailOK = true;
                     }
                 }
                 if (!$bEMailOK && $ar_ticket["OWNER_USER_ID"] > 0) {
                     $db_user = CUser::GetByID($ar_ticket["OWNER_USER_ID"]);
                     if ($arUser = $db_user->Fetch()) {
                         $ticket_email = strtolower(CMailUtil::ExtractMailAddress($arUser["EMAIL"]));
                         if ($check_type == "domain") {
                             $ticket_email = substr($ticket_email, strpos($ticket_email, "@"));
                         }
                         if (strpos($message_email_addr, $ticket_email) !== false) {
                             $bEMailOK = true;
                         }
                     }
                 }
                 if (!$bEMailOK) {
                     $TID = 0;
                 }
             }
         } else {
             $TID = 0;
         }
     }
     //when message subject is empty - generate it from message body
     $title = trim($arMessageFields["SUBJECT"]);
     if (strlen($title) <= 0) {
         $title = trim($arMessageFields["BODY"]);
         $title = preg_replace("/[\n\r\t ]+/s" . BX_UTF_PCRE_MODIFIER, " ", $title);
         $title = substr($title, 0, 50);
     }
     $arFieldsTicket = array("CLOSE" => "N", "TITLE" => $title, "MESSAGE" => $arMessageFields["BODY"], "MESSAGE_AUTHOR_SID" => $message_email, "MESSAGE_SOURCE_SID" => "email", "MODIFIED_MODULE_NAME" => "mail", "EXTERNAL_ID" => $ID, "EXTERNAL_FIELD_1" => $arMessageFields["HEADER"]);
     if ($W_SUPPORT_USER_FIND == "Y") {
         $o = "LAST_LOGIN";
         $b = "DESC";
         $res = CUser::GetList($o, $b, array("ACTIVE" => "Y", "=EMAIL" => $message_email_addr));
         if (($arr = $res->Fetch()) && strtolower(CMailUtil::ExtractMailAddress($arr["EMAIL"])) == $message_email_addr) {
             $AUTHOR_USER_ID = $arr["ID"];
         }
     }
     // process attach files
     $arFILES = array();
     $rsAttach = CMailAttachment::GetList(array(), array("MESSAGE_ID" => $ID));
     while ($arAttach = $rsAttach->Fetch()) {
         // save from db to hdd
         $filename = CTempFile::GetFileName(md5(uniqid("")) . ".tmp");
         CheckDirPath($filename);
         if (file_put_contents($filename, $arAttach["FILE_DATA"]) !== false) {
             $arFILES[] = array("name" => $arAttach["FILE_NAME"], "type" => $arAttach["CONTENT_TYPE"], "size" => filesize($filename), "tmp_name" => $filename, "MODULE_ID" => "support");
         }
     }
     if (count($arFILES) > 0) {
         $arFieldsTicket["FILES"] = $arFILES;
     }
     $arFieldsTicket["CURRENT_USER_ID"] = null;
     if (intval($AUTHOR_USER_ID) > 0) {
         $resU = CUser::GetByID(intval($AUTHOR_USER_ID));
         if ($arU = $resU->Fetch()) {
             $arFieldsTicket["CURRENT_USER_ID"] = $arU["ID"];
         }
     }
     if ($TID > 0) {
         $arFieldsTicket["MESSAGE_AUTHOR_USER_ID"] = $AUTHOR_USER_ID;
         if ($W_SUPPORT_ADD_MESSAGE_AS_HIDDEN == "Y") {
             $arFieldsTicket["HIDDEN"] = "Y";
         }
         if ($arMessageFields["SPAM"] == "Y") {
             $arFieldsTicket["IS_SPAM"] = "Y";
         }
         $TID = CTicket::Set($arFieldsTicket, $MESSAGE_ID, $TID, "N");
     } else {
         $arFieldsTicket["SITE_ID"] = $SITE_ID;
         $arFieldsTicket["OWNER_USER_ID"] = $AUTHOR_USER_ID;
         $arFieldsTicket["OWNER_SID"] = $message_email;
         $arFieldsTicket["CREATED_MODULE_NAME"] = "mail";
         $arFieldsTicket["SOURCE_SID"] = "email";
         if ($arMessageFields["SPAM"] == "Y") {
             $arFieldsTicket["IS_SPAM"] = "Y";
         }
         if ($W_SUPPORT_CATEGORY > 0) {
             $arFieldsTicket["CATEGORY_ID"] = $W_SUPPORT_CATEGORY;
         }
         if ($W_SUPPORT_CRITICALITY > 0) {
             $arFieldsTicket["CRITICALITY_ID"] = $W_SUPPORT_CRITICALITY;
         }
         if (strlen(trim($arFieldsTicket["TITLE"])) <= 0) {
             $arFieldsTicket["TITLE"] = " ";
         }
         if (strlen(trim($arFieldsTicket["MESSAGE"])) <= 0) {
             $arFieldsTicket["MESSAGE"] = " ";
         }
         $TID = CTicket::Set($arFieldsTicket, $MESSAGE_ID, "", "N");
     }
 }
コード例 #4
0
ファイル: mail.php プロジェクト: ASDAFF/1C_Bitrix_info_site
	function ExtractAllMailAddresses($emails)
	{
		$result = array();
		$arEMails = explode(",", $emails);
		foreach($arEMails as $mail)
		{
			$result[] = CMailUtil::ExtractMailAddress($mail);
		}
		return $result;
	}
コード例 #5
0
 function SocnetEMailMessageAdd($arMessageFields, $ACTION_VARS)
 {
     if (!is_array($arMessageFields["FORUM_EMAIL_FILTER"])) {
         return false;
     }
     if (!CModule::IncludeModule("socialnetwork")) {
         return false;
     }
     $arParams = $arMessageFields["FORUM_EMAIL_FILTER"];
     if (!CSocNetFeatures::IsActiveFeature(SONET_ENTITY_GROUP, $arParams["SOCNET_GROUP_ID"], "forum")) {
         return false;
     }
     // Найдем кто отправитель
     $message_email = strlen($arMessageFields["FIELD_REPLY_TO"]) > 0 ? $arMessageFields["FIELD_REPLY_TO"] : $arMessageFields["FIELD_FROM"];
     $message_email_addr = strtolower(CMailUtil::ExtractMailAddress($message_email));
     $o = "LAST_LOGIN";
     $b = "DESC";
     $res = CUser::GetList($o, $b, array("ACTIVE" => "Y", "EMAIL" => $message_email_addr));
     if (($arUser = $res->Fetch()) && strtolower(CMailUtil::ExtractMailAddress($arUser["EMAIL"])) == $message_email_addr) {
         $AUTHOR_USER_ID = $arUser["ID"];
     } elseif ($arParams["NOT_MEMBER_POST"] == "Y") {
         $AUTHOR_USER_ID = false;
     } else {
         CMailLog::AddMessage(array("MAILBOX_ID" => $arMessageFields["MAILBOX_ID"], "MESSAGE_ID" => $arMessageFields["ID"], "FILTER_ID" => $arParams["MAIL_FILTER_ID"], "LOG_TYPE" => "FILTER_ERROR", "MESSAGE" => GetMessage("FORUM_MAIL_ERROR1") . ": " . $message_email_addr));
         return false;
     }
     if ($arParams["NOT_MEMBER_POST"] != "Y") {
         // Проверим права доступа
         if (CSocNetFeaturesPerms::CanPerformOperation($AUTHOR_USER_ID, SONET_ENTITY_GROUP, $arParams["SOCNET_GROUP_ID"], "forum", "full")) {
             $PERMISSION = "Y";
         } elseif (CSocNetFeaturesPerms::CanPerformOperation($AUTHOR_USER_ID, SONET_ENTITY_GROUP, $arParams["SOCNET_GROUP_ID"], "forum", "newtopic")) {
             $PERMISSION = "M";
         } elseif (CSocNetFeaturesPerms::CanPerformOperation($AUTHOR_USER_ID, SONET_ENTITY_GROUP, $arParams["SOCNET_GROUP_ID"], "forum", "answer")) {
             $PERMISSION = "I";
         } else {
             CMailLog::AddMessage(array("MAILBOX_ID" => $arMessageFields["MAILBOX_ID"], "MESSAGE_ID" => $arMessageFields["ID"], "FILTER_ID" => $arParams["MAIL_FILTER_ID"], "LOG_TYPE" => "FILTER_ERROR", "MESSAGE" => GetMessage("FORUM_MAIL_ERROR2") . " " . $arUser["LOGIN"] . " [" . $AUTHOR_USER_ID . "] (" . $message_email_addr . ")"));
             return false;
         }
     }
     $body = $arMessageFields["BODY"];
     //$body = preg_replace("/(\r\n)+/", "\r\n", $body);
     $p = strpos($body, "\r\nFrom:");
     if ($p > 0) {
         $body = substr($body, 0, $p) . "\r\n[CUT]" . substr($body, $p) . "[/CUT]";
     }
     $subject = $arMessageFields["SUBJECT"];
     // обрежем все RE и FW
     $subject = trim(preg_replace('#^\\s*((RE[0-9\\[\\]]*:\\s*)|(FW:\\s*))+(.*)$#i', '\\4', $subject));
     if ($subject == '') {
         $subject = GetMessage("FORUM_MAIL_EMPTY_TOPIC_TITLE") . " " . rand();
     }
     // Найдем какая тема
     $arFields = array();
     $FORUM_ID = IntVal($arParams["FORUM_ID"]);
     $SOCNET_GROUP_ID = IntVal($arParams["SOCNET_GROUP_ID"]);
     $TOPIC_ID = 0;
     global $DB;
     if ($arMessageFields["IN_REPLY_TO"] != '') {
         $dbTopic = $DB->Query("SELECT FT.ID FROM b_forum_topic FT INNER JOIN b_forum_message FM ON FM.TOPIC_ID=FT.ID WHERE FM.XML_ID='" . $DB->ForSQL($arMessageFields["IN_REPLY_TO"], 255) . "' AND FT.FORUM_ID=" . $FORUM_ID . " AND FT.SOCNET_GROUP_ID=" . $SOCNET_GROUP_ID);
         if ($arTopic = $dbTopic->Fetch()) {
             $TOPIC_ID = $arTopic["ID"];
         }
     }
     if ($arParams["USE_SUBJECT"] == "Y" && $TOPIC_ID <= 0) {
         $dbTopic = $DB->Query("SELECT ID FROM b_forum_topic WHERE TITLE='" . $DB->ForSQL($subject, 255) . "' AND FORUM_ID=" . $FORUM_ID . " AND SOCNET_GROUP_ID=" . $SOCNET_GROUP_ID);
         // ограничить по старости?
         if ($arTopic = $dbTopic->Fetch()) {
             $TOPIC_ID = $arTopic["ID"];
         }
     }
     if ($AUTHOR_USER_ID > 0) {
         if ($TOPIC_ID < 0 && $PERMISSION <= "I") {
             CMailLog::AddMessage(array("MAILBOX_ID" => $arMessageFields["MAILBOX_ID"], "MESSAGE_ID" => $arMessageFields["ID"], "FILTER_ID" => $arParams["MAIL_FILTER_ID"], "LOG_TYPE" => "FILTER_ERROR", "MESSAGE" => GetMessage("FORUM_MAIL_ERROR3") . " " . $arUser["LOGIN"] . " [" . $AUTHOR_USER_ID . "] (" . $message_email_addr . ")"));
             return false;
         }
         $bSHOW_NAME = true;
         $res = CForumUser::GetByUSER_ID($AUTHOR_USER_ID);
         if ($res) {
             $bSHOW_NAME = $res["SHOW_NAME"] == "Y";
         }
         if ($bSHOW_NAME) {
             $AUTHOR_NAME = $arUser["NAME"] . (strlen($arUser["NAME"]) <= 0 || strlen($arUser["LAST_NAME"]) <= 0 ? "" : " ") . $arUser["LAST_NAME"];
         }
         if (strlen(Trim($AUTHOR_NAME)) <= 0) {
             $AUTHOR_NAME = $arUser["LOGIN"];
         }
     } else {
         $AUTHOR_NAME = $arMessageFields["FIELD_FROM"];
         $arFields["AUTHOR_EMAIL"] = $arMessageFields["FIELD_FROM"];
     }
     $arFields["NEW_TOPIC"] = "N";
     if ($PERMISSION >= "Q") {
         $arFields["APPROVED"] = "Y";
     } else {
         $arFields["APPROVED"] = $arParams["MODERATION"] == "Y" ? "N" : "Y";
     }
     // Добавим новую тему
     if ($TOPIC_ID <= 0) {
         $arTopicFields = array("TITLE" => $subject, "FORUM_ID" => $FORUM_ID, "USER_START_ID" => $AUTHOR_USER_ID, "OWNER_ID" => $AUTHOR_USER_ID, "SOCNET_GROUP_ID" => $SOCNET_GROUP_ID);
         $arTopicFields["XML_ID"] = $arMessageFields["MSG_ID"];
         $arTopicFields["APPROVED"] = $arFields['APPROVED'];
         $arTopicFields["USER_START_NAME"] = $AUTHOR_NAME;
         $arTopicFields["LAST_POSTER_NAME"] = $AUTHOR_NAME;
         $TOPIC_ID = CForumTopic::Add($arTopicFields);
         if (IntVal($TOPIC_ID) <= 0) {
             CMailLog::AddMessage(array("MAILBOX_ID" => $arMessageFields["MAILBOX_ID"], "MESSAGE_ID" => $arMessageFields["ID"], "FILTER_ID" => $arParams["MAIL_FILTER_ID"], "LOG_TYPE" => "FILTER_ERROR", "MESSAGE" => GetMessage("FORUM_MAIL_ERROR4")));
             return false;
         }
         $arFields["NEW_TOPIC"] = "Y";
     }
     // Добавим сообщение
     $arFields["POST_MESSAGE"] = $body;
     // Аттаченные файлы
     $arFILES = array();
     $rsAttach = CMailAttachment::GetList(array(), array("MESSAGE_ID" => $arMessageFields["ID"]));
     while ($arAttach = $rsAttach->Fetch()) {
         $filename = CTempFile::GetFileName(md5(uniqid("")) . ".tmp");
         CheckDirPath($filename);
         if (file_put_contents($filename, $arAttach["FILE_DATA"]) !== false) {
             $arFile = array("name" => $arAttach["FILE_NAME"], "type" => $arAttach["CONTENT_TYPE"], "size" => @filesize($filename), "tmp_name" => $filename, "MODULE_ID" => "forum");
             $arFilter = array("FORUM_ID" => $FORUM_ID);
             $arFiles = array($arFile);
             if (CForumFiles::CheckFields($arFiles, $arFilter)) {
                 $arFILES[] = $arFiles[0];
             } else {
                 $oError = $GLOBALS["APPLICATION"]->GetException();
                 CMailLog::AddMessage(array("MAILBOX_ID" => $arMessageFields["MAILBOX_ID"], "MESSAGE_ID" => $arMessageFields["ID"], "FILTER_ID" => $arParams["MAIL_FILTER_ID"], "LOG_TYPE" => "FILTER_ERROR", "MESSAGE" => GetMessage("FORUM_MAIL_ERROR6") . " (" . $arAttach["FILE_NAME"] . "): " . ($oError && $oError->GetString() ? $oError->GetString() : "")));
             }
         }
     }
     if (count($arFILES) > 0) {
         $arFields["FILES"] = $arFILES;
     }
     $arFields["AUTHOR_NAME"] = $AUTHOR_NAME;
     $arFields["AUTHOR_ID"] = $AUTHOR_USER_ID;
     $arFields["FORUM_ID"] = $FORUM_ID;
     $arFields["TOPIC_ID"] = $TOPIC_ID;
     $arFields["XML_ID"] = $arMessageFields["MSG_ID"];
     $arFields["SOURCE_ID"] = "EMAIL";
     $arRes = array();
     if (!empty($arMessageFields["FIELD_FROM"])) {
         $arRes[] = "From: " . $arMessageFields["FIELD_FROM"];
     }
     if (!empty($arMessageFields["FIELD_TO"])) {
         $arRes[] = "To: " . $arMessageFields["FIELD_TO"];
     }
     if (!empty($arMessageFields["FIELD_CC"])) {
         $arRes[] = "Cc: " . $arMessageFields["FIELD_CC"];
     }
     if (!empty($arMessageFields["FIELD_BCC"])) {
         $arRes[] = "Bcc: " . $arMessageFields["FIELD_BCC"];
     }
     $arRes[] = "Subject: " . $arMessageFields["SUBJECT"];
     $arRes[] = "Date: " . $arMessageFields["FIELD_DATE"];
     $arFields["MAIL_HEADER"] = implode("\r\n", $arRes);
     preg_match_all('#Received:\\s+from\\s+(.*)by.*#i', $arMessageFields["HEADER"], $regs);
     if (is_array($regs) && is_array($regs[1])) {
         $arFields["AUTHOR_IP"] = $arFields["AUTHOR_REAL_IP"] = '<email: ' . $regs[1][count($regs[1]) - 1] . '>';
     } else {
         $arFields["AUTHOR_IP"] = $arFields["AUTHOR_REAL_IP"] = '<email: no address>';
     }
     /*
     
     $AUTHOR_IP = ForumGetRealIP();
     $AUTHOR_IP_tmp = $AUTHOR_IP;
     $AUTHOR_REAL_IP = $_SERVER['REMOTE_ADDR'];
     if (COption::GetOptionString("forum", "FORUM_GETHOSTBYADDR", "N") == "Y")
     {
     	$AUTHOR_IP = @gethostbyaddr($AUTHOR_IP);
     
     	if ($AUTHOR_IP_tmp==$AUTHOR_REAL_IP)
     		$AUTHOR_REAL_IP = $AUTHOR_IP;
     	else
     		$AUTHOR_REAL_IP = @gethostbyaddr($AUTHOR_REAL_IP);
     }
     
     $arFields["AUTHOR_IP"] = ($AUTHOR_IP!==False) ? $AUTHOR_IP : "<no address>";
     $arFields["AUTHOR_REAL_IP"] = ($AUTHOR_REAL_IP!==False) ? $AUTHOR_REAL_IP : "<no address>";
     */
     $strErrorMessage = '';
     $MESSAGE_ID = CForumMessage::Add($arFields, false);
     if (intVal($MESSAGE_ID) <= 0) {
         $str = $GLOBALS['APPLICATION']->GetException();
         if ($str && $str->GetString()) {
             $strErrorMessage .= "[" . $str->GetString() . "]";
         }
         if ($arFields["NEW_TOPIC"] == 'Y') {
             CForumTopic::Delete($TOPIC_ID);
         }
         CMailLog::AddMessage(array("MAILBOX_ID" => $arMessageFields["MAILBOX_ID"], "MESSAGE_ID" => $arMessageFields["ID"], "FILTER_ID" => $arParams["MAIL_FILTER_ID"], "LOG_TYPE" => "FILTER_ERROR", "MESSAGE" => GetMessage("FORUM_MAIL_ERROR5") . " " . $strErrorMessage));
     }
     if ($MESSAGE_ID > 0) {
         CMailLog::AddMessage(array("MAILBOX_ID" => $arMessageFields["MAILBOX_ID"], "MESSAGE_ID" => $arMessageFields["ID"], "FILTER_ID" => $arParams["MAIL_FILTER_ID"], "LOG_TYPE" => "FILTER_COMPLETE", "MESSAGE" => GetMessage("FORUM_MAIL_OK") . " " . $MESSAGE_ID . " (TID#" . $TOPIC_ID . ")"));
         CForumMessage::SendMailMessage($MESSAGE_ID, array(), false, "NEW_FORUM_MESSAGE");
         $dbSite = CSite::GetById($arMessageFields["LID"]);
         if ($arSite = $dbSite->Fetch()) {
             $lang = $arSite['LANGUAGE_ID'];
         } else {
             $lang = $LANGUAGE_ID;
         }
         $parser = new forumTextParser();
         $arForum = CForumNew::GetByID($FORUM_ID);
         $arAllow = array("HTML" => "N", "ANCHOR" => "N", "BIU" => "N", "IMG" => "N", "LIST" => "N", "QUOTE" => "N", "CODE" => "N", "FONT" => "N", "SMILES" => "N", "UPLOAD" => $arForum["ALLOW_UPLOAD"], "NL2BR" => "N", "TABLE" => "N", "ALIGN" => "N");
         if ($arFields["NEW_TOPIC"] == "Y") {
             $arFieldsForSocnet = array("ENTITY_TYPE" => SONET_ENTITY_GROUP, "ENTITY_ID" => $SOCNET_GROUP_ID, "EVENT_ID" => "forum", "=LOG_DATE" => $GLOBALS["DB"]->CurrentTimeFunction(), "TITLE_TEMPLATE" => str_replace("#AUTHOR_NAME#", $AUTHOR_NAME, CForumEmail::GetLangMessage("FORUM_MAIL_SOCNET_TITLE_TOPIC", $lang)), "TITLE" => $subject, "MESSAGE" => $parser->convert($body, $arAllow), "TEXT_MESSAGE" => $parser->convert4mail($body), "URL" => CComponentEngine::MakePathFromTemplate($arParams["URL_TEMPLATES_MESSAGE"], array("UID" => $AUTHOR_USER_ID, "FID" => $FORUM_ID, "TID" => $TOPIC_ID, "MID" => $MESSAGE_ID)), "PARAMS" => serialize(array("PATH_TO_MESSAGE" => CComponentEngine::MakePathFromTemplate($arParams["URL_TEMPLATES_MESSAGE"], array("TID" => $TOPIC_ID)))), "MODULE_ID" => false, "CALLBACK_FUNC" => false, "SOURCE_ID" => $MESSAGE_ID, "RATING_TYPE_ID" => "FORUM_TOPIC", "RATING_ENTITY_ID" => intval($TOPIC_ID));
             if (intVal($AUTHOR_USER_ID) > 0) {
                 $arFieldsForSocnet["USER_ID"] = $AUTHOR_USER_ID;
             }
             $logID = CSocNetLog::Add($arFieldsForSocnet, false);
             if (intval($logID) > 0) {
                 CSocNetLog::Update($logID, array("TMP_ID" => $logID));
                 CSocNetLogRights::SetForSonet($logID, $arFieldsForSocnet["ENTITY_TYPE"], $arFieldsForSocnet["ENTITY_ID"], "forum", "view", true);
                 CSocNetLog::SendEvent($logID, "SONET_NEW_EVENT", $logID);
             }
         } else {
             $dbForumMessage = CForumMessage::GetList(array("ID" => "ASC"), array("TOPIC_ID" => $TOPIC_ID));
             if ($arForumMessage = $dbForumMessage->Fetch()) {
                 $dbRes = CSocNetLog::GetList(array("ID" => "DESC"), array("EVENT_ID" => "forum", "SOURCE_ID" => $arForumMessage["ID"]), false, false, array("ID", "TMP_ID"));
                 if ($arRes = $dbRes->Fetch()) {
                     $log_id = $arRes["TMP_ID"];
                 } else {
                     $dbFirstMessage = CForumMessage::GetList(array("ID" => "ASC"), array("TOPIC_ID" => $arForumMessage["TOPIC_ID"]), false, 1);
                     if ($arFirstMessage = $dbFirstMessage->Fetch()) {
                         $arTopic = CForumTopic::GetByID($arFirstMessage["TOPIC_ID"]);
                         $sFirstMessageText = COption::GetOptionString("forum", "FILTER", "Y") == "Y" ? $arFirstMessage["POST_MESSAGE_FILTER"] : $arFirstMessage["POST_MESSAGE"];
                         $sFirstMessageURL = CComponentEngine::MakePathFromTemplate($arParams["URL_TEMPLATES_MESSAGE"], array("UID" => $arFirstMessage["AUTHOR_ID"], "FID" => $arFirstMessage["FORUM_ID"], "TID" => $arFirstMessage["TOPIC_ID"], "MID" => $arFirstMessage["ID"]));
                         $arFieldsForSocnet = array("ENTITY_TYPE" => SONET_ENTITY_GROUP, "ENTITY_ID" => $SOCNET_GROUP_ID, "EVENT_ID" => "forum", "LOG_DATE" => $arFirstMessage["POST_DATE"], "LOG_UPDATE" => $arFirstMessage["POST_DATE"], "TITLE_TEMPLATE" => str_replace("#AUTHOR_NAME#", $arFirstMessage["AUTHOR_NAME"], GetMessage("SONET_FORUM_LOG_TOPIC_TEMPLATE")), "TITLE" => $arTopic["TITLE"], "MESSAGE" => $parser->convert($sFirstMessageText, $arAllow), "TEXT_MESSAGE" => $parser->convert4mail($sFirstMessageText), "URL" => $sFirstMessageURL, "PARAMS" => serialize(array("PATH_TO_MESSAGE" => CComponentEngine::MakePathFromTemplate($arParams["URL_TEMPLATES_MESSAGE"], array("TID" => $arFirstMessage["TOPIC_ID"])))), "MODULE_ID" => false, "CALLBACK_FUNC" => false, "SOURCE_ID" => $arFirstMessage["ID"], "RATING_TYPE_ID" => "FORUM_TOPIC", "RATING_ENTITY_ID" => intval($arFirstMessage["TOPIC_ID"]));
                         if (intVal($arFirstMessage["AUTHOR_ID"]) > 0) {
                             $arFieldsForSocnet["USER_ID"] = $arFirstMessage["AUTHOR_ID"];
                         }
                         $log_id = CSocNetLog::Add($arFieldsForSocnet, false);
                         if (intval($log_id) > 0) {
                             CSocNetLog::Update($log_id, array("TMP_ID" => $log_id));
                             CSocNetLogRights::SetForSonet($log_id, $arFieldsForSocnet["ENTITY_TYPE"], $arFieldsForSocnet["ENTITY_ID"], "forum", "view", true);
                         }
                     }
                 }
                 if (intval($log_id) > 0) {
                     $arFieldsForSocnet = array("ENTITY_TYPE" => SONET_ENTITY_GROUP, "ENTITY_ID" => $SOCNET_GROUP_ID, "EVENT_ID" => "forum", "LOG_ID" => $log_id, "=LOG_DATE" => $GLOBALS["DB"]->CurrentTimeFunction(), "MESSAGE" => $parser->convert($body, $arAllow), "TEXT_MESSAGE" => $parser->convert4mail($body), "URL" => CComponentEngine::MakePathFromTemplate($arParams["URL_TEMPLATES_MESSAGE"], array("UID" => $AUTHOR_USER_ID, "FID" => $FORUM_ID, "TID" => $TOPIC_ID, "MID" => $MESSAGE_ID)), "MODULE_ID" => false, "SOURCE_ID" => $MESSAGE_ID, "RATING_TYPE_ID" => "FORUM_POST", "RATING_ENTITY_ID" => intval($MESSAGE_ID));
                     if (intVal($AUTHOR_USER_ID) > 0) {
                         $arFieldsForSocnet["USER_ID"] = $AUTHOR_USER_ID;
                     }
                     CSocNetLogComments::Add($arFieldsForSocnet);
                 }
             }
         }
     }
 }