Text, text => TYPETEXT, TYPEMULTIPART => multipart, multipart => TYPEMULTIPART, TYPEMESSAGE => message, message => TYPEMESSAGE, TYPEAPPLICATION => application, application => TYPEAPPLICATION, TYPEAUDIO => audio, audio => TYPEAUDIO, TYPEIMAGE => image, image => TYPEIMAGE, TYPEVIDEO => video, video => TYPEVIDEO, TYPEOTHER => unknown, unknown => TYPEOTHER); $ mime_encodings = array (ENC7BIT => 7bit, 7bit => ENC7BIT, ENC8BIT => 8bit, 8bit => ENC8BIT, ENCBINARY => binary, binary => ENCBINARY, ENCBASE64 => base64, base64 => ENCBASE64, encoding => quoted-printable, quoted-printable => ENCQUOTEDPRINTABLE, ENCOTHER => unknown, unknown => ENCOTHER ); /*** The MIME: class provides methods for dealing with MIME standards. ** @ author Chuck Hagenbuch * @ Version $ Revision: 1.64 $ * @ since Horde 1.3 * @ package horde. mime */class MIME {/*** Determine if a string contains 8-bit characters. * @ access private ** @ param string $ string The string to check. * @ return boolean true if it does, false if it doesnt. */function is8bit ($ string) {if (is_string ($ string) {for ($ I = 0; $ I <strlen ($ string); $ I ++) {if (ord ($ string [$ I])> 7) return true ;} Return false;}/*** Encode a string containing non-ascii characters according to RFC 2047. ** @ param string $ text The text to encode. * @ param string $ charset (optional) The character set of the text. * @ param boolean $ outer Is this the final iteration? ** @ Return string The text, encoded only if it contains non-ascii characters. */function encode ($ text, $ charset = null, $ outer = true) {if (MIME: is8bit ($ text) {if (strlen ($ text) * 3) + strlen ($ charset) + 7)> 76) {$ text = MIME: encode (substr ($ text, 0, (23-strlen ($ charset), $ charset ). MIME: encode (substr ($ text, (23-strlen ($ charset), $ charset, false);} else {$ text = "=? $ Charset? B? ". Strtr (trim (base64_encode ($ text )),,_)."? = ";}}// If this is the final iteration, take off any trailing // newline/tab chars. if ($ outer & (substr ($ text,-2) = "") $ text = substr ($ text, 0,-2); return $ text ;} /*** Encode a string containing email addresses according to RFC 2047. ** This differs from MIME: encode () because it keeps email * addresses legal, only encoding the personal information. ** @ param string $ text The email ad Dresses to encode. * @ param string $ charset (optional) The character set of the text. * @ param string $ defserver (optional) The default domain to append to mailboxes. ** @ return string The text, encoded only if it contains non-ascii characters. */function encodeAddress ($ text, $ charset = null, $ defserver = null) {include_once Mail/RFC822.php; $ addr_arr = Mail_RFC822: parseAddressList ($ text, $ def Server, false, false); $ text =; if (is_array ($ addr_arr) {foreach ($ addr_arr as $ addr) {if (empty ($ addr-> personal )) {$ personal =;} else {if (substr ($ addr-> personal, 0, 1) = ") & (substr ($ addr-> personal, -1) = ") {$ addr-> personal = substr ($ addr-> personal, 1,-1);} $ personal = MIME :: encode ($ addr-> personal, $ charset);} if (strlen ($ text )! = 0) $ text. =,; // FIXME: dependency on imap module $ text. = MIME: trimEmailAddress (imap_rfc822_write_address ($ addr-> mailbox, $ addr-> host, $ personal);} return $ text ;} /*** Decode an RFC 2047-encoded string. ** @ param string $ string The text to decode. * @ return string The decoded text, or the original string if it was not encoded. */function decode ($ string) {$ pos = strpos ($ string, = ?); If ($ pos = false) {return $ string;} // take out any spaces between multiple encoded words $ string = preg_replace (|? = S =? | ,? == ?, $ String); $ preceding = substr ($ string, 0, $ pos); // save any preceding text $ search = substr ($ string, $ pos + 2, 75 ); // the mime header spec says this is the longest a single encoded word can be $ d1 = strpos ($ search ,?); If (! Is_int ($ d1) {return $ string;} $ charset = substr ($ string, $ pos + 2, $ d1); $ search = substr ($ search, $ d1 + 1); $ d2 = strpos ($ search ,?); If (! Is_int ($ d2) {return $ string ;}$ encoding = substr ($ search, 0, $ d2); $ search = substr ($ search, $ d2 + 1 ); $ end = strpos ($ search ,? =); If (! Is_int ($ end) {return $ string ;}$ encoded_text = substr ($ search, 0, $ end); $ rest = substr ($ string, (strlen ($ preceding. $ charset. $ encoding. $ encoded_text) + 6); switch ($ encoding) {case Q: case q: $ encoded_text = str_replace (_, % 20, $ encoded_text ); $ encoded_text = str_replace (=, %, $ encoded_text); $ decoded = urldecode ($ encoded_text);/* Convert Cyrillic character sets. */if (stristr ($ GLOBALS [Registry]-> getCharset (), windows-1251) {if (stristr ($ charset, koi8-r) {$ decoded = convert_cyr_string ($ decoded, k, w) ;}} if (stristr ($ GLOBALS [registry]-> getCharset (), koi8-r) {if (stristr ($ charset, windows-1251 )) {$ decoded = convert_cyr_string ($ decoded, w, k) ;}} break; case B: case B: $ decoded = urldecode (base64_decode ($ encoded_text )); if (stristr ($ GLOBALS [registry]-> getCharset (), windo Ws-1251) {if (stristr ($ charset, koi8-r) {$ decoded = convert_cyr_string ($ decoded, k, w );}} if (stristr ($ GLOBALS [registry]-> getCharset (), koi8-r) {if (stristr ($ charset, windows-1251) {$ decoded = convert_cyr_string ($ decoded, w, k) ;}} break; default: $ decoded =?. $ Charset .?. $ Encoding .?. $ Encoded_text .? =; Break;} return $ preceding. $ decoded. MIME: decode ($ rest);}/*** If an email address has no personal information, get rid of any * angle brackets (<>) around it. ** @ param string $ address The address to trim. * @ return string The trimmed address. */function trimEmailAddress ($ address) {$ address = trim ($ address); if (substr ($ address, 0, 1) = <) & (substr ($ address,-1) ==>) {$ address = Substr ($ address, 1,-1);} return $ address ;}}?>