00001 <?php 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00037 function kjwmail_sendplain($to, $subject, $message, $additional_headers = null, $additional_parameters = '') {
00038         assert('$additional_headers === null || (is_array($additional_headers) && !isset($additional_headers["To"]))');
00039 
00040         
00041         $addCr = defined('KJW_MAIL_USE_LF_ONLY') && !KJW_MAIL_USE_LF_ONLY;
00042         $host = str_replace(array("\x00", "\n", "\r", "<", ">"), '', @$_SERVER['HTTP_HOST']);
00043         if ($host == '')
00044                 $host = 'localhost';
00045         $to = str_replace(array("\x00", "\n", "\r"), '', $to);
00046         $subject = kjwmail_encode_header(str_replace("\x00", '', $subject));
00047         $message = str_replace("\r\n", "\n", str_replace("\x00", '', $message));
00048 
00049         
00050         $headers = array(
00051                 'From' => '"' . ucfirst($host) . "\" <postmaster@$host>",
00052                 'Content-Type' => 'text/plain; charset=UTF-8',
00053                 'Content-Transfer-Encoding' => 'quoted-printable',
00054         );
00055         if (isset($_SERVER['REMOTE_ADDR']))
00056                 $headers['X-Originating-IP'] = '[' . $_SERVER['REMOTE_ADDR'] . ']';
00057         if (isset($_SERVER['REQUEST_URI']))
00058                 $headers['X-Originating-URL'] = 'http://' . $host . $_SERVER['REQUEST_URI'];
00059         if (isset($_SERVER['HTTP_REFERER']))
00060                 $headers['X-Originating-URL-referer'] = $_SERVER['HTTP_REFERER'];
00061         if ($additional_headers !== null)
00062                 $headers = array_merge($headers, $additional_headers); 
00063         
00064         
00065         $additional_headers = array();
00066         foreach ($headers as $k => $v) {
00067                 assert('preg_match("/[A-Za-z0-9-]/", $k)');
00068                 array_push($additional_headers, $k . ': ' . kjwmail_encode_header($v));
00069         }
00070         $message = preg_replace("/([\x80-\xff=])/e", "sprintf('=%02X',ord('$1'))", $message);
00071         if ($addCr) {
00072                 $message = str_replace("\n", "\r\n", $message);
00073                 $headers = implode("\r\n", $additional_headers);
00074         } else {
00075                 $headers = implode("\n", $additional_headers);
00076         }
00077 
00078         
00079         return mail($to, $subject, $message, $headers, $additional_parameters);
00080 }
00081 
00082 
00093 function kjwmail_encode_header($str) {
00094         $str = str_replace("\x00", '', $str);
00095         if (!preg_match("/[\x01-\x1f\x80-\xff]/", $str))
00096                 return $str;
00097         if (strpos($str, '@') === false) 
00098                 return '=?UTF-8?Q?' . preg_replace("/([\x01-\x1f\x80-\xff _=?])/e", "'$1'==' '?'_':sprintf('=%02X',ord('$1'))", $str) . '?=';
00099 
00100         $header_parts = explode('@', $str);
00101         assert('sizeof($header_parts) > 1');
00102         
00103         
00104         foreach (array(0, sizeof($header_parts) - 1) as $i) {
00105                 if ($i == 0)
00106                         $e = strrpos($header_parts[$i], ' ');
00107                 else
00108                         $e = strpos($header_parts[$i], ' ');
00109                 if ($e !== false) {
00110                         if ($i != 0)
00111                                 ++$e;
00112                         $begin = substr($header_parts[$i], 0, $e);
00113                         $end = substr($header_parts[$i], $e);
00114                         if (preg_match("/[\x01-\x1f\x80-\xff]/", $begin)) {
00115                                 $begin = '=?UTF-8?Q?'
00116                                                 . preg_replace("/([\x01-\x1f\x80-\xff _=?])/e", "'$1'==' '?'_':sprintf('=%02X',ord('$1'))", $begin) . '?=';
00117                         }
00118                         $header_parts[$i] = $begin . $end;
00119                 }
00120         }
00121 
00122         
00123         for ($i = 1; $i < sizeof($header_parts) - 1; ++$i) {
00124                 $b = strpos($header_parts[$i], ' ');
00125                 $e = strrpos($header_parts[$i], ' ');
00126                 if ($b != $e && $b !== false) {
00127                         ++$b;
00128                         $begin = substr($header_parts[$i], 0, $b);
00129                         $mid = substr($header_parts[$i], $b, $e - $b);
00130                         $end = substr($header_parts[$i], $e);
00131                         if (preg_match("/[\x01-\x1f\x80-\xff]/", $mid)) {
00132                                 $mid = '=?UTF-8?Q?'
00133                                                 . preg_replace("/([\x01-\x1f\x80-\xff _=?])/e", "'$1'==' '?'_':sprintf('=%02X',ord('$1'))", $mid) . '?=';
00134                         }
00135                         $header_parts[$i] = $begin . $mid . $end;
00136                 }
00137         }
00138 
00139         
00140         $str = implode('@', $header_parts);
00141         
00142         return $str;
00143 }
00144 
00145 ?>