Exemple #1
0
 function compose($text = null, $html = null, $attach = null, $uniq = null, $end = null, $debug = null)
 {
     if (!FUNC4::is_debug($debug)) {
         $debug = debug_backtrace();
     }
     $_mime = new MIME4();
     $err = array();
     if ($text == null && $html == null) {
         $err[] = 'message is not set';
     } else {
         if ($text != null) {
             if (!(is_array($text) && isset($text['header'], $text['content']) && is_string($text['header']) && is_string($text['content']) && MIME4::isset_header($text['header'], 'content-type', 'text/plain', $debug))) {
                 $err[] = 'invalid text message type';
             }
         }
         if ($html != null) {
             if (!(is_array($html) && isset($html['header'], $html['content']) && is_string($html['header']) && is_string($html['content']) && MIME4::isset_header($html['header'], 'content-type', 'text/html', $debug))) {
                 $err[] = 'invalid html message type';
             }
         }
     }
     if ($attach != null) {
         if (is_array($attach) && count($attach) > 0) {
             foreach ($attach as $arr) {
                 if (!(is_array($arr) && isset($arr['header'], $arr['content']) && is_string($arr['header']) && is_string($arr['content']) && (MIME4::isset_header($arr['header'], 'content-disposition', 'inline', $debug) || MIME4::isset_header($arr['header'], 'content-disposition', 'attachment', $debug)))) {
                     $err[] = 'invalid attachment type';
                     break;
                 }
             }
         } else {
             $err[] = 'invalid attachment format';
         }
     }
     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 {
         $multipart = false;
         if ($text && $html) {
             $multipart = true;
         }
         if ($attach) {
             $multipart = true;
         }
         $header = $body = array();
         $header[] = 'Date: ' . date('r');
         $header[] = base64_decode('WC1NYWlsZXI6IFhQTTQgdi4wLjIgPCB3d3cueHBlcnRtYWlsZXIuY29tID4=');
         if ($multipart) {
             $uniq = $uniq == null ? 0 : intval($uniq);
             $boundary1 = '=_1.' . MIME4::unique($uniq++);
             $boundary2 = '=_2.' . MIME4::unique($uniq++);
             $boundary3 = '=_3.' . MIME4::unique($uniq++);
             $disp['inline'] = $disp['attachment'] = false;
             if ($attach != null) {
                 foreach ($attach as $darr) {
                     if (MIME4::isset_header($darr['header'], 'content-disposition', 'inline', $debug)) {
                         $disp['inline'] = true;
                     } else {
                         if (MIME4::isset_header($darr['header'], 'content-disposition', 'attachment', $debug)) {
                             $disp['attachment'] = true;
                         }
                     }
                 }
             }
             $hstr = 'Content-Type: multipart/%s;' . $end . "\t" . 'boundary="%s"';
             $bstr = '--%s' . $end . '%s' . $end . $end . '%s';
             $header[] = 'MIME-Version: 1.0';
             $body[] = 'This is a message in MIME Format. If you see this, your mail reader does not support this format.' . $end;
             if ($text && $html) {
                 if ($disp['inline'] && $disp['attachment']) {
                     $header[] = sprintf($hstr, 'mixed', $boundary1);
                     $body[] = '--' . $boundary1;
                     $body[] = sprintf($hstr, 'related', $boundary2) . $end;
                     $body[] = '--' . $boundary2;
                     $body[] = sprintf($hstr, 'alternative', $boundary3) . $end;
                     $body[] = sprintf($bstr, $boundary3, $text['header'], $text['content']);
                     $body[] = sprintf($bstr, $boundary3, $html['header'], $html['content']);
                     $body[] = '--' . $boundary3 . '--';
                     foreach ($attach as $desc) {
                         if (MIME4::isset_header($desc['header'], 'content-disposition', 'inline', $debug)) {
                             $body[] = sprintf($bstr, $boundary2, $desc['header'], $desc['content']);
                         }
                     }
                     $body[] = '--' . $boundary2 . '--';
                     foreach ($attach as $desc) {
                         if (MIME4::isset_header($desc['header'], 'content-disposition', 'attachment', $debug)) {
                             $body[] = sprintf($bstr, $boundary1, $desc['header'], $desc['content']);
                         }
                     }
                     $body[] = '--' . $boundary1 . '--';
                 } else {
                     if ($disp['inline']) {
                         $header[] = sprintf($hstr, 'related', $boundary1);
                         $body[] = '--' . $boundary1;
                         $body[] = sprintf($hstr, 'alternative', $boundary2) . $end;
                         $body[] = sprintf($bstr, $boundary2, $text['header'], $text['content']);
                         $body[] = sprintf($bstr, $boundary2, $html['header'], $html['content']);
                         $body[] = '--' . $boundary2 . '--';
                         foreach ($attach as $desc) {
                             $body[] = sprintf($bstr, $boundary1, $desc['header'], $desc['content']);
                         }
                         $body[] = '--' . $boundary1 . '--';
                     } else {
                         if ($disp['attachment']) {
                             $header[] = sprintf($hstr, 'mixed', $boundary1);
                             $body[] = '--' . $boundary1;
                             $body[] = sprintf($hstr, 'alternative', $boundary2) . $end;
                             $body[] = sprintf($bstr, $boundary2, $text['header'], $text['content']);
                             $body[] = sprintf($bstr, $boundary2, $html['header'], $html['content']);
                             $body[] = '--' . $boundary2 . '--';
                             foreach ($attach as $desc) {
                                 $body[] = sprintf($bstr, $boundary1, $desc['header'], $desc['content']);
                             }
                             $body[] = '--' . $boundary1 . '--';
                         } else {
                             $header[] = sprintf($hstr, 'alternative', $boundary1);
                             $body[] = sprintf($bstr, $boundary1, $text['header'], $text['content']);
                             $body[] = sprintf($bstr, $boundary1, $html['header'], $html['content']);
                             $body[] = '--' . $boundary1 . '--';
                         }
                     }
                 }
             } else {
                 if ($text) {
                     $header[] = sprintf($hstr, 'mixed', $boundary1);
                     $body[] = sprintf($bstr, $boundary1, $text['header'], $text['content']);
                     foreach ($attach as $desc) {
                         $body[] = sprintf($bstr, $boundary1, $desc['header'], $desc['content']);
                     }
                     $body[] = '--' . $boundary1 . '--';
                 } else {
                     if ($html) {
                         if ($disp['inline'] && $disp['attachment']) {
                             $header[] = sprintf($hstr, 'mixed', $boundary1);
                             $body[] = '--' . $boundary1;
                             $body[] = sprintf($hstr, 'related', $boundary2) . $end;
                             $body[] = sprintf($bstr, $boundary2, $html['header'], $html['content']);
                             foreach ($attach as $desc) {
                                 if (MIME4::isset_header($desc['header'], 'content-disposition', 'inline', $debug)) {
                                     $body[] = sprintf($bstr, $boundary2, $desc['header'], $desc['content']);
                                 }
                             }
                             $body[] = '--' . $boundary2 . '--';
                             foreach ($attach as $desc) {
                                 if (MIME4::isset_header($desc['header'], 'content-disposition', 'attachment', $debug)) {
                                     $body[] = sprintf($bstr, $boundary1, $desc['header'], $desc['content']);
                                 }
                             }
                             $body[] = '--' . $boundary1 . '--';
                         } else {
                             if ($disp['inline']) {
                                 $header[] = sprintf($hstr, 'related', $boundary1);
                                 $body[] = sprintf($bstr, $boundary1, $html['header'], $html['content']);
                                 foreach ($attach as $desc) {
                                     $body[] = sprintf($bstr, $boundary1, $desc['header'], $desc['content']);
                                 }
                                 $body[] = '--' . $boundary1 . '--';
                             } else {
                                 if ($disp['attachment']) {
                                     $header[] = sprintf($hstr, 'mixed', $boundary1);
                                     $body[] = sprintf($bstr, $boundary1, $html['header'], $html['content']);
                                     foreach ($attach as $desc) {
                                         $body[] = sprintf($bstr, $boundary1, $desc['header'], $desc['content']);
                                     }
                                     $body[] = '--' . $boundary1 . '--';
                                 }
                             }
                         }
                     }
                 }
             }
         } else {
             if ($text) {
                 $header[] = $text['header'];
                 $body[] = $text['content'];
             } else {
                 if ($html) {
                     $header[] = $html['header'];
                     $body[] = $html['content'];
                 }
             }
         }
         return array('header' => implode($end, $header), 'content' => implode($end, $body));
     }
 }
Exemple #2
0
 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;
                     }
                 }
             }
         }
     }
 }