Example #1
0
 public static function sendMail($to, $subject, $message, $from = "IBOS2.0 MAIL CONTROL")
 {
     $setting = Ibos::app()->setting->toArray();
     $mail = $setting["setting"]["mail"];
     if (!is_array($mail)) {
         $mail = unserialize($mail);
     }
     $smtpNums = count($mail["server"]);
     if ($smtpNums) {
         $randId = array_rand($mail["server"], 1);
         $server = $mail["server"][$randId];
         $delimiter = $mail["maildelimiter"] == 1 ? "\r\n" : ($mail["maildelimiter"] == 2 ? "\r" : "\n");
         $unit = $setting["setting"]["unit"];
         if ($mail["mailsend"] == 2) {
             $emailFrom = empty($from) ? $unit["adminemail"] : $from;
         } else {
             $emailFrom = $from == "" ? "=?" . CHARSET . "?B?" . base64_encode($unit["fullname"]) . "?= <" . $unit["adminemail"] . ">" : (preg_match("/^(.+?) \\<(.+?)\\>\$/", $from, $mats) ? "=?" . CHARSET . "?B?" . base64_encode($mats[1]) . "?= <{$mats['2']}>" : $from);
         }
         $emailTo = preg_match("/^(.+?) \\<(.+?)\\>\$/", $to, $mats) ? $mail["mailusername"] ? "=?" . CHARSET . "?B?" . base64_encode($mats[1]) . "?= <{$mats['2']}>" : $mats[2] : $to;
         $emailSubject = "=?" . CHARSET . "?B?" . base64_encode(preg_replace("/[\r|\n]/", "", "[" . $unit["fullname"] . "] " . $subject)) . "?=";
         $emailMessage = chunk_split(base64_encode(str_replace("\n", "\r\n", str_replace("\r", "\n", str_replace("\r\n", "\n", str_replace("\n\r", "\r", $message))))));
         $host = $_SERVER["HTTP_HOST"];
         $version = "IBOS " . $setting["version"];
         $headers = "From: {$emailFrom}{$delimiter}X-Priority: 3{$delimiter}X-Mailer: {$host} {$version} {$delimiter}MIME-Version: 1.0{$delimiter}Content-type: text/html; charset=" . CHARSET . "{$delimiter}Content-Transfer-Encoding: base64{$delimiter}";
         if ($mail["mailsend"] == 1) {
             if (!($fp = EnvUtil::getSocketOpen($server["server"], $errno, $errstr, $server["port"], 30))) {
                 Log::write(array("msg" => "({$server["server"]}:{$server["port"]}) CONNECT - Unable to connect to the SMTP server", "type" => "SMTP"), "action", "sendMail");
                 return false;
             }
             stream_set_blocking($fp, true);
             $lastMessage = fgets($fp, 512);
             if (substr($lastMessage, 0, 3) != "220") {
                 Log::write(array("msg" => "({$server["server"]}:{$server["port"]}) CONNECT - {$lastMessage}", "type" => "SMTP"), "action", "sendMail");
                 return false;
             }
             fputs($fp, ($server["auth"] ? "EHLO" : "HELO") . " ibos\r\n");
             $lastMessage = fgets($fp, 512);
             if (substr($lastMessage, 0, 3) != 220 && substr($lastMessage, 0, 3) != 250) {
                 Log::write(array("msg" => "({$server["server"]}:{$server["port"]}) HELO/EHLO - {$lastMessage}", "type" => "SMTP"), "action", "sendMail");
                 return false;
             } elseif (1) {
                 if (substr($lastMessage, 3, 1) != "-" || empty($lastMessage)) {
                     break;
                 }
                 $lastMessage = fgets($fp, 512);
             }
             break;
             $lastMessage = fgets($fp, 512);
             if ($server["auth"]) {
                 fputs($fp, "AUTH LOGIN\r\n");
                 $lastMessage = fgets($fp, 512);
                 if (substr($lastMessage, 0, 3) != 334) {
                     Log::write(array("msg" => "({$server["server"]}:{$server["port"]}) AUTH LOGIN - {$lastMessage}", "type" => "SMTP"), "action", "sendMail");
                     return false;
                 }
                 fputs($fp, base64_encode($server["username"]) . "\r\n");
                 $lastMessage = fgets($fp, 512);
                 if (substr($lastMessage, 0, 3) != 334) {
                     Log::write(array("msg" => "({$server["server"]}:{$server["port"]}) USERNAME - {$lastMessage}", "type" => "SMTP"), "action", "sendMail");
                     return false;
                 }
                 fputs($fp, base64_encode($server["password"]) . "\r\n");
                 $lastMessage = fgets($fp, 512);
                 if (substr($lastMessage, 0, 3) != 235) {
                     Log::write(array("msg" => "({$server["server"]}:{$server["port"]}) PASSWORD - {$lastMessage}", "type" => "SMTP"), "action", "sendMail");
                     return false;
                 }
                 $emailFrom = $server["from"];
             }
             fputs($fp, "MAIL FROM: <" . preg_replace("/.*\\<(.+?)\\>.*/", "", $emailFrom) . ">\r\n");
             $lastMessage = fgets($fp, 512);
             if (substr($lastMessage, 0, 3) != 250) {
                 fputs($fp, "MAIL FROM: <" . preg_replace("/.*\\<(.+?)\\>.*/", "", $emailFrom) . ">\r\n");
                 $lastMessage = fgets($fp, 512);
                 Log::write(array("msg" => "({$server["server"]}:{$server["port"]}) MAIL FROM  - {$lastMessage}", "type" => "SMTP"), "action", "sendMail");
                 return false;
             }
             fputs($fp, "RCPT TO: <" . preg_replace("/.*\\<(.+?)\\>.*/", "", $to) . ">\r\n");
             $lastMessage = fgets($fp, 512);
             if (substr($lastMessage, 0, 3) != 250) {
                 fputs($fp, "RCPT TO: <" . preg_replace("/.*\\<(.+?)\\>.*/", "", $to) . ">\r\n");
                 $lastMessage = fgets($fp, 512);
                 Log::write(array("msg" => "({$server["server"]}:{$server["port"]}) RCPT TO - {$lastMessage}", "type" => "SMTP"), "action", "sendMail");
                 return false;
             }
             fputs($fp, "DATA\r\n");
             $lastMessage = fgets($fp, 512);
             if (substr($lastMessage, 0, 3) != 354) {
                 Log::write(array("msg" => "({$server["server"]}:{$server["port"]}) DATA - {$lastMessage}", "type" => "SMTP"), "action", "sendMail");
                 return false;
             }
             $timeOffset = $setting["setting"]["timeoffset"];
             if (function_exists("date_default_timezone_set")) {
                 @date_default_timezone_set("Etc/GMT" . (0 < $timeOffset ? "-" : "+") . abs($timeOffset));
             }
             $headers .= "Message-ID: <" . date("YmdHs") . "." . substr(md5($emailMessage . microtime()), 0, 6) . rand(100000, 999999) . "@" . $_SERVER["HTTP_HOST"] . ">{$delimiter}";
             fputs($fp, "Date: " . date("r") . "\r\n");
             fputs($fp, "To: " . $emailTo . "\r\n");
             fputs($fp, "Subject: " . $emailSubject . "\r\n");
             fputs($fp, $headers . "\r\n");
             fputs($fp, "\r\n\r\n");
             fputs($fp, "{$emailMessage}\r\n.\r\n");
             $lastMessage = fgets($fp, 512);
             if (substr($lastMessage, 0, 3) != 250) {
                 Log::write(array("msg" => "({$server["server"]}:{$server["port"]}) END - {$lastMessage}", "type" => "SMTP"), "action", "sendMail");
             }
             fputs($fp, "QUIT\r\n");
             return true;
         } elseif ($mail["mailsend"] == 2) {
             ini_set("SMTP", $server["server"]);
             ini_set("smtp_port", $server["port"]);
             ini_set("sendmail_from", $emailFrom);
             if (function_exists("mail") && @mail($emailTo, $emailSubject, $emailMessage, $headers)) {
                 return true;
             }
             return false;
         }
     }
     return false;
 }