function is_mail($addr = null, $vermx = false, $debug = null) { if (!FUNC4::is_debug($debug)) { $debug = debug_backtrace(); } $err = array(); if (!is_string($addr)) { $err[] = 'invalid address type'; } if (!is_bool($vermx)) { $err[] = 'invalid MX type'; } if (count($err) > 0) { FUNC4::trace($debug, implode(', ', $err)); } else { $ret = count($exp = explode('@', $addr)) === 2 && $exp[0] != '' && $exp[1] != '' && FUNC4::is_alpha($exp[0], true, '_-.') && (FUNC4::is_hostname($exp[1]) || FUNC4::is_ipv4($exp[1])); if ($ret && $vermx) { if (FUNC4::is_ipv4($exp[1])) { $ret = false; } else { $ret = FUNC4::is_win() ? FUNC4::getmxrr_win($exp[1], $mxh, $debug) : getmxrr($exp[1], $mxh); } } return $ret; } }
function send($resc = null, $debug = null) { global $_RESULT; $_RESULT = $err = array(); if (!FUNC4::is_debug($debug)) { $debug = debug_backtrace(); } if (is_resource($resc)) { $delivery = 'relay'; } else { if ($resc == null) { $resc = 'local'; } if (!is_string($resc)) { $err[] = 'invalid connection type'; } else { $resc = strtolower(trim($resc)); if ($resc == 'local' || $resc == 'client' || $resc == 'sendmail' || $resc == 'qmail') { $delivery = $resc; } else { $err[] = 'invalid connection value'; } } } if (count($this->To) == 0) { $err[] = 'to mail address is not set'; } if (!isset($this->Subject['content'])) { $err[] = 'mail subject is not set'; } if (!(isset($this->Text['content']) || isset($this->Html['content']))) { $err[] = 'mail message is not set'; } if (count($err) > 0) { FUNC4::trace($debug, implode(', ', $err)); } else { $header['local'] = $header['client'] = array(); $body = ''; $from = null; if (isset($this->From['address']) && is_string($this->From['address'])) { $from = $this->From['address']; $hv = 'From: '; if (isset($this->From['name'])) { $hn = MIME4::encode_header($this->From['name'], isset($this->From['charset']) ? $this->From['charset'] : null, isset($this->From['encoding']) ? $this->From['encoding'] : null, null, null, $debug); if ($hn == $this->From['name']) { $hn = '"' . str_replace('"', '\\"', $this->From['name']) . '"'; } $hv .= $hn . ' <' . $this->From['address'] . '>'; } else { $hv .= $this->From['address']; } $header['local'][] = $hv; $header['client'][] = $hv; } $addrs = $arr = array(); foreach ($this->To as $to) { if (isset($to['address']) && FUNC4::is_mail($to['address'], false, $debug)) { $addrs[] = $to['address']; if (isset($to['name'])) { $hn = MIME4::encode_header($to['name'], isset($to['charset']) ? $to['charset'] : null, isset($to['encoding']) ? $to['encoding'] : null, null, null, $debug); if ($hn == $to['name']) { $hn = '"' . str_replace('"', '\\"', $to['name']) . '"'; } $arr[] = $hn . ' <' . $to['address'] . '>'; } else { $arr[] = $to['address']; } } } if (count($arr) > 0) { $to = implode(', ', $arr); $header['client'][] = 'To: ' . implode(', ' . $this->_mime->LE . "\t", $arr); } else { FUNC4::trace($debug, 'to mail address is not set'); } if (count($this->Cc) > 0) { $arr = array(); foreach ($this->Cc as $cc) { if (isset($cc['address']) && FUNC4::is_mail($cc['address'], false, $debug)) { $addrs[] = $cc['address']; if (isset($cc['name'])) { $hn = MIME4::encode_header($cc['name'], isset($cc['charset']) ? $cc['charset'] : null, isset($cc['encoding']) ? $cc['encoding'] : null, null, null, $debug); if ($hn == $cc['name']) { $hn = '"' . str_replace('"', '\\"', $cc['name']) . '"'; } $arr[] = $hn . ' <' . $cc['address'] . '>'; } else { $arr[] = $cc['address']; } } } if (count($arr) > 0) { $header['local'][] = 'Cc: ' . implode(', ', $arr); $header['client'][] = 'Cc: ' . implode(', ' . $this->_mime->LE . "\t", $arr); } } $hbcc = ''; if (count($this->Bcc) > 0) { $arr = array(); foreach ($this->Bcc as $bcc) { if (FUNC4::is_mail($bcc, false, $debug)) { $arr[] = $bcc; $addrs[] = $bcc; } } if (count($arr) > 0) { $header['local'][] = 'Bcc: ' . implode(', ', $arr); $hbcc = $this->_mime->LE . 'Bcc: ' . implode(', ', $arr); } } $hn = MIME4::encode_header($this->Subject['content'], isset($this->Subject['charset']) ? $this->Subject['charset'] : null, isset($this->Subject['encoding']) ? $this->Subject['encoding'] : null, null, null, $debug); $subject = $hn; $header['client'][] = 'Subject: ' . $hn; if (is_int($this->Priority) || is_string($this->Priority)) { $arr = false; if ($this->Priority == 1 || $this->Priority == 'high') { $arr = array(1, 'high'); } else { if ($this->Priority == 3 || $this->Priority == 'normal') { $arr = array(3, 'normal'); } else { if ($this->Priority == 5 || $this->Priority == 'low') { $arr = array(5, 'low'); } } } if ($arr) { $header['local'][] = 'X-Priority: ' . $arr[0]; $header['local'][] = 'X-MSMail-Priority: ' . $arr[1]; $header['client'][] = 'X-Priority: ' . $arr[0]; $header['client'][] = 'X-MSMail-Priority: ' . $arr[1]; } } $header['client'][] = 'Message-Id: <' . MIME4::unique() . '@xpertmailer.com>'; if (count($this->Header) > 0) { foreach ($this->Header as $harr) { if (isset($harr['name'], $harr['value']) && strlen($harr['name']) >= 2 && FUNC4::is_alpha($harr['name'], true, '-')) { $hn = MIME4::encode_header($harr['value'], isset($harr['charset']) ? $harr['charset'] : null, isset($harr['encoding']) ? $harr['encoding'] : null, null, null, $debug); $header['local'][] = ucfirst($harr['name']) . ': ' . $hn; $header['client'][] = ucfirst($harr['name']) . ': ' . $hn; } } } $text = $html = $att = null; if (isset($this->Text['content'])) { $text = MIME4::message($this->Text['content'], 'text/plain', null, isset($this->Text['charset']) ? $this->Text['charset'] : null, isset($this->Text['encoding']) ? $this->Text['encoding'] : null, null, null, null, null, $debug); } if (isset($this->Html['content'])) { $html = MIME4::message($this->Html['content'], 'text/html', null, isset($this->Html['charset']) ? $this->Html['charset'] : null, isset($this->Html['encoding']) ? $this->Html['encoding'] : null, null, null, null, null, $debug); } if (count($this->Attach) > 0) { $att = array(); foreach ($this->Attach as $attach) { if (isset($attach['content'])) { $att[] = MIME4::message($attach['content'], isset($attach['type']) ? $attach['type'] : null, isset($attach['name']) ? $attach['name'] : null, isset($attach['charset']) ? $attach['charset'] : null, isset($attach['encoding']) ? $attach['encoding'] : null, isset($attach['disposition']) ? $attach['disposition'] : null, isset($attach['id']) ? $attach['id'] : null, null, null, $debug); } } if (count($att) == 0) { $att = null; } } $arr = MIME4::compose($text, $html, $att); if ($delivery == 'relay') { $res = SMTP4::send($resc, $addrs, implode($this->_mime->LE, $header['client']) . $this->_mime->LE . $arr['header'] . $this->_mime->LE . $this->_mime->LE . $arr['content'], $this->Path != null ? $this->Path : $from, $debug); return $this->_result($_RESULT, $res); } else { if ($delivery == 'local') { $rpath = !FUNC4::is_win() && $this->Path != null ? '-f ' . $this->Path : null; $spath = $this->Path != null ? @ini_set('sendmail_from', $this->Path) : false; $res = mail($to, $subject, $arr['content'], implode($this->_mime->LE, $header['local']) . $this->_mime->LE . $arr['header'], $rpath); if ($spath) { @ini_restore('sendmail_from'); } return $this->_result(array(0 => 'send mail local'), $res); } else { if ($delivery == 'client') { $group = array(); foreach ($addrs as $addr) { $exp = explode('@', $addr); $group[strtolower($exp[1])][] = $addr; } $ret = true; $reg = count($group) == 1; foreach ($group as $domain => $arrs) { $con = SMTP4::mxconnect($domain, $this->Port, $this->Tout, $this->Name, $this->Context, $debug); if ($reg) { $this->_result(array($domain => $_RESULT)); } if ($con) { if (!SMTP4::send($con, $arrs, implode($this->_mime->LE, $header['client']) . $this->_mime->LE . $arr['header'] . $this->_mime->LE . $this->_mime->LE . $arr['content'], $this->Path != null ? $this->Path : $from, $debug)) { $ret = false; } if ($reg) { $this->_result(array($domain => $_RESULT)); } SMTP4::disconnect($con, $debug); } else { $ret = false; } } if (!$reg) { $this->_result(array(0 => 'send mail client')); } return $ret; } else { if ($delivery == 'sendmail' || $delivery == 'qmail') { $ret = false; $comm = ($delivery == 'sendmail' ? $this->SendMail : $this->QMail) . ' -oi' . ($this->Path != null ? ' -f ' . $this->Path : '') . ' -t'; if ($con = popen($comm, 'w')) { if (fputs($con, implode($this->_mime->LE, $header['client']) . $hbcc . $this->_mime->LE . $arr['header'] . $this->_mime->LE . $this->_mime->LE . $arr['content'])) { $res = pclose($con) >> 8 & 0xff; if ($res == 0) { $ret = true; $this->_result(array(0 => 'send mail using "' . ucfirst($delivery) . '" program')); } else { $this->_result(array(0 => $res)); } } else { $this->_result(array(0 => 'can not write')); } } else { $this->_result(array(0 => 'can not write line command')); } return $ret; } } } } } }
function message($content = null, $type = null, $name = null, $charset = null, $encoding = null, $disposition = null, $id = null, $len = null, $end = null, $debug = null) { if (!FUNC4::is_debug($debug)) { $debug = debug_backtrace(); } $_mime = new MIME4(); $err = array(); if (!(is_string($content) && $content != '')) { $err[] = 'invalid content type'; } if ($type == null) { $type = 'application/octet-stream'; } else { if (is_string($type)) { $type = trim(FUNC4::str_clear($type)); if (strlen($type) < 4) { $err[] = 'invalid type value'; } } else { $err[] = 'invalid type'; } } if (is_string($name)) { $name = trim(FUNC4::str_clear($name)); if ($name == '') { $err[] = 'invalid name value'; } } else { if ($name != null) { $err[] = 'invalid name type'; } } if ($charset == null) { $charset = $_mime->MCHARSET; } else { if (!is_string($charset)) { $err[] = 'invalid charset type'; } else { if (!(strlen($charset) >= 2 && FUNC4::is_alpha($charset, true, '-'))) { $err[] = 'invalid charset value'; } } } if ($encoding == null) { $encoding = $_mime->MENCDEF; } else { if (!is_string($encoding)) { $err[] = 'invalid encoding type'; } else { $encoding = strtolower(FUNC4::str_clear($encoding)); if (!isset($_mime->mencarr[$encoding])) { $err[] = 'invalid encoding value'; } } } if ($disposition == null) { $disposition = 'inline'; } else { if (is_string($disposition)) { $disposition = strtolower(FUNC4::str_clear($disposition)); if (!($disposition == 'inline' || $disposition == 'attachment')) { $err[] = 'invalid disposition value'; } } else { $err[] = 'invalid disposition type'; } } if (is_string($id)) { $id = FUNC4::str_clear($id, array(' ')); if ($id == '') { $err[] = 'invalid id value'; } } else { if ($id != null) { $err[] = 'invalid id type'; } } if ($len == null) { $len = $_mime->MLEN; } else { if (!(is_int($len) && $len > 1)) { $err[] = 'invalid line length value'; } } if ($end == null) { $end = $_mime->LE; } else { if (!is_string($end)) { $err[] = 'invalid line end value'; } } if (count($err) > 0) { FUNC4::trace($debug, implode(', ', $err)); } else { $header = '' . 'Content-Type: ' . $type . ';' . $end . "\t" . 'charset="' . $charset . '"' . ($name == null ? '' : ';' . $end . "\t" . 'name="' . $name . '"') . $end . 'Content-Transfer-Encoding: ' . $encoding . $end . 'Content-Disposition: ' . $disposition . ($name == null ? '' : ';' . $end . "\t" . 'filename="' . $name . '"') . ($id == null ? '' : $end . 'Content-ID: <' . $id . '>'); if ($encoding == '7bit' || $encoding == '8bit') { $content = wordwrap(MIME4::fix_eol($content), $len, $end, true); } else { if ($encoding == 'base64') { $content = rtrim(chunk_split(base64_encode($content), $len, $end)); } else { if ($encoding == 'quoted-printable') { $content = MIME4::qp_encode(MIME4::fix_eol($content), $len, $end); } } } return array('header' => $header, 'content' => $content); } }
function split_header($str = null, $debug = null) { if (!FUNC4::is_debug($debug)) { $debug = debug_backtrace(); } if (!(is_string($str) && $str != '')) { FUNC4::trace($debug, 'invalid header value'); } else { $str = str_replace(array(";\r\n\t", "; \r\n\t", ";\r\n ", "; \r\n "), '; ', $str); $str = str_replace(array(";\n\t", "; \n\t", ";\n ", "; \n "), '; ', $str); $str = str_replace(array("\r\n\t", "\r\n "), '', $str); $str = str_replace(array("\n\t", "\n "), '', $str); $arr = array(); foreach (explode("\n", $str) as $line) { $line = trim(FUNC4::str_clear($line)); if ($line != '') { if (count($exp1 = explode(':', $line, 2)) == 2) { $name = rtrim($exp1[0]); $val1 = ltrim($exp1[1]); if (strlen($name) > 1 && FUNC4::is_alpha($name, true, '-') && $val1 != '') { $name = ucfirst($name); $hadd = array(); if (substr(strtolower($name), 0, 8) == 'content-') { $exp2 = explode('; ', $val1); $cnt2 = count($exp2); if ($cnt2 > 1) { for ($i = 1; $i < $cnt2; $i++) { if (count($exp3 = explode('=', $exp2[$i], 2)) == 2) { $hset = trim($exp3[0]); $hval = trim($exp3[1], ' "'); if ($hset != '' && $hval != '') { $hadd[strtolower($hset)] = $hval; } } } } } $val2 = count($hadd) > 0 ? trim($exp2[0]) : $val1; $arr[] = array('name' => $name, 'value' => $val2, 'content' => $hadd); } } } } if (count($arr) > 0) { return $arr; } else { FUNC4::trace($debug, 'invalid header value', 1); } } }