喜悦国际村 » 代码共享 » 共享自己MIME邮件编码解码包,写的不好,就当是抛砖引玉了

页: [1]
angeloisme2008-3-3 02:26 AM
共享自己MIME邮件编码解码包,写的不好,就当是抛砖引玉了

这是一个实现MIME邮件编码解码的包,是我去年闲着没事的时候写.当初写的时候并不是想给什么人或公司用,所以在性能方面没做什么考虑,纯属实验性质的.其实我根本不觉得自己所在的公司会用它,因为实现邮件的编码和解码可以有更好更方便的方法,我写它只是为了不折不扣的诠释MIME协议,就是一个玩意儿,用来排遣一下无聊,疏放一下心中的块垒罢了.如果有人觉得写得好,尽管拿去用,总比烂在我自己手里要强.而且我非常欢迎有人在看后能给我指出一些不足,给我提提意见,我先谢谢大家了.

文件总共有十个,后面还有一个例子,如果熟悉MIME看看就能明白,帖子里还有压缩包.

[color=Red]文件 1/10 MIME.Class.php[/color][php]
/**
* MIME操作的抽象类只封装一些常量和常用函数
* @author 满鸿
* @version 1.0
* @abstract
*/
abstract class MIME
{
  /**
   * MIME版本
   * @static
   */
  const MIME_VERSION = '1.0';
   
  /**
   * MIME语言缩写
   * @static
   */
  const EN = 'en';
  const ZH = 'zh';
  const JA = 'ja';
  const KO = 'ko';
  const FR = 'fr';
  const DE = 'de';
  const RU = 'ru';
  
  /**
   * 邮件优先级-垃圾信件
   * @static
   */
  const PRIOTITY_1 = 1;
  /**
   * 邮件优先级-无关紧要
   * @static
   */
  const PRIOTITY_2 = 2;
  /**
   * 邮件优先级-普通信件
   * @static
   */
  const PRIOTITY_3 = 3;
  /**
   * 邮件优先级-重要信件
   * @static
   */
  const PRIOTITY_4 = 4;
  /**
   * 邮件优先级-十万火急
   * @static
   */
  const PRIOTITY_5 = 5;
  
  /**
   * 显示实体时的排序优先:content-type
   * @static
   */
  const TYPE       = 1;
  /**
   * 显示实体时的排序优先:content-language
   * @static
   */
  const LANGUAGE   = 2;
  
  /**
   * 实体显示方式:附件
   * @static
   */
  const ATTACHMENT = 'attachment';
  /**
   * 实体显示方式:内联显示
   * @static
   */
  const INLINE     = 'inline';
  
  /**
   * 编码方式
   * @static
   */
  const EN7BIT     = '7bit';
  const EN8BIT     = '8bit';
  const ENBINARY   = 'binary';
  const ENBASE64   = 'base64';
  const ENQP       = 'quoted-printable';

  /**
   * 字符集
   * @static
   */
  const US_ASCII          = 'us-ascii';
  const BS_4730           = 'bs_4730';
  const ISO_2022_KR       = 'iso-2022-kr';
  const EUC_KR            = 'euc-kr';
  const ISO_2022_JP_2     = 'iso-2202-jp-2';
  const ISO_2022_CN       = 'iso-2022-cn';
  const ISO_2022_CN_EXT   = 'iso-2022-cn-ext';
  const JIS_C6220_1969_jp = 'jis-c6220-1969-jp';
  
  const KOI8_R     = 'koi8-r';
  const UTF7       = 'utf-7';
  const UTF8       = 'utf-8';
  const UTF16      = 'utf-16';
  const UTF32      = 'utf-32';
  const GBK        = 'gbk';
  const GB18030    = 'gb18030';
  const Shift_JIS  = 'shift_jis';
  const EUC_JP     = 'euc-jp';
  const GB2312     = 'gb2312';
  const Big5       = 'big5';
  const HZ_GB_2312 = 'hz_gb_2312';
  
  const ISO_8859_1   = 'iso-8859-1';
  const ISO_8859_2   = 'iso-8859-2';
  const ISO_8859_3   = 'iso-8859-3';
  const ISO_8859_4   = 'iso-8859-4';
  const ISO_8859_5   = 'iso-8859-5';
  const ISO_8859_6   = 'iso-8859-6';
  const ISO_8859_7   = 'iso-8859-7';
  const ISO_8859_8   = 'iso-8859-8';
  const ISO_8859_9   = 'iso-8859-9';
  const ISO_8859_10  = 'iso-8859-10';
  const ISO_8859_13  = 'iso-8859-13';
  const ISO_8859_14  = 'iso-8859-14';
  const ISO_8859_15  = 'iso-8859-15';
  const ISO_8859_16  = 'iso-8859-16';
  const UNKNOWN_8BIT = 'unknown-8bit';

  /**
   * MIME实体类型:单部件实体
   * @static
   */
  const SINGLE_ENTITY         = 'mime_00001';
  /**
   * MIME实体类型:信头实体
   * @static
   */
  const RFC822HEADER_ENTITY   = 'mime_00002';
  /**
   * MIME实体类型:多部件实体
   * @static
   */
  const MULTIPART_ENTITY      = 'mime_00003';
  /**
   * MIME实体类型:rfc822实体
   * @static
   */
  const RFC822MESSAGE_ENTITY  = 'mime_00004';
  /**
   * MIME实体类型:单部件实体
   * @static
   */
  const PARITALHEADER_ENTITY  = 'mime_00005';
  /**
   * MIME实体类型:单部件实体
   * @static
   */
  const PARITALMESSAGE_ENTITY = 'mime_00006';
  /**
   * MIME实体类型:外部数据实体
   * @static
   */
  const EXTERNALBODY_ENTITY   = 'mime_00007';
  
  /**
   * 实体类型
   * @static
   */
  const TEXT  = 'text';
  const IMAGE = 'image';
  const AUDIO = 'audio';
  const VIDEO = 'video';
  const APPLICATION = 'application';
  const MESSAGE     = 'message';
  const MULTIPART   = 'multipart';
  
  /**
   * 单部件实体类型
   * @static
   */
  const TEXT_PLAIN  = 'text/plain';
  const TEXT_HTML   = 'text/html';
  const TEXT_XML    = 'text/xml';
  const IMAGE_GIF   = 'image/gif';
  const IMAGE_JPEG  = 'image/jpeg';
  const IMAGE_PNG   = 'image/png';
  const IMAGE_BMP   = 'image/bmp';
  const AUDIO_BASIC = 'audio/basic';
  const VIDEO_MPEG  = 'video/mpeg';
  const TEXT_RFC822_HEADERS = 'text/rfc822-headers';
  
  const APPLICATION_OCTET_STREAM = 'application/octet-stream';
  const APPLICATION_MS_EXCEL     = 'application/vnd.ms-excel';
  const APPLICATION_MS_WORD      = 'application/msword';
  const APPLICATION_X_GZIP       = 'application/x-gzip';
  const APPLICATION_PDF          = 'application/pdf';
  const APPLICATION_MS_PPT       = 'application/vnd.ms-powerpoint';
  
  /**
   * message类型实体
   * @static
   */
  const MESSAGE_RFC822           = 'message/rfc822';
  const MESSAGE_PARTIAL          = 'message/partial';
  const MESSAGE_EXTERNAL_BODY    = 'message/external-body';
  
  /**
   * 多部件实体类型
   * @static
   */
  const MULTIPART_MIXED          = 'multipart/mixed';
  const MULTIPART_ALTERNATIVE    = 'multipart/alternative';
  const MULTIPART_DIGEST         = 'multipart/digest';
  const MULTIPART_PARALLEL       = 'multipart/parallel';
  const MULTIPART_RELATED        = 'multipart/related';
  
  /**
   * 对字符进行quoted-printable编码,适用于文本实体内容的编码
   *
   * @param string $str
   * @return string 编码后的字符串
   */
  public static function quoted_printable_encode($str)
  {
    $all = str_split($str);
    $str = '';
    $line_size = 0;
    $is_encode = false;
    $all_size = count($all);

    foreach ($all as $key => $tmp)
    {
      $ascii = ord($tmp);
      if (($ascii >= 33 && $ascii <= 60)   || ($ascii >= 62 && $ascii <= 126)
                                                       || $ascii === 32) {

        if (($ascii >= 33 && $ascii <= 36) || ($ascii >= 91 && $ascii <= 94)
                                           || ($ascii >= 123 && $ascii <= 126)
                                           || $ascii === 64
                                           || $ascii === 39) {
          $is_encode = true;
        } else {
          $is_encode = false;
        }
      } else {
        $is_encode = true;
      }

      if($ascii === 32 && $key >= $all_size - 1) {
                    $is_encode = true;
      }

      if ($is_encode) {
        if (($line_size + 3 > 76) || ($line_size + 3 === 76 && $key < $all_size - 1)) {
          $str .= "=\r\n=" . bin2hex($tmp);
          $line_size = 3;
        } else {
          $str .= '=' . bin2hex($tmp);
          $line_size += 3;
        }
      } else {
        if (($line_size + 1 > 76) || ($line_size + 1 === 76 && $key < $all_size - 1)) {
          $str .= "=\r\n" . $tmp;
          $line_size = 1;
        } else {
          $str .= $tmp;
          $line_size += 1;
        }
      }
    }
    return $str;
  }

  /**
   * 对字符进行quoted-printable编码,适用于信头字段的值
   *
   * @param string $str
   * @return string 编码后的字符串
   */
  public static function Q_encode($str)
  {
    $all = str_split($str);
    $str = '';
    $is_encode = false;

    foreach ($all as $tmp)
    {
      $ascii = ord($tmp);
      if ($ascii >= 48 && $ascii <= 57 || $ascii >= 65 && $ascii <= 90
                                       || $ascii >= 97 && $ascii <= 122
                                       || $ascii === 33
                                       || $ascii === 42
                                       || $ascii === 43
                                       || $ascii === 45
                                       || $ascii === 47
                                       || $ascii === 61
                                       || $ascii === 95) {
        $is_encode = false;
      } else {
        $is_encode = true;
      }
      
      if ($is_encode) {
          $str .= '=' . bin2hex($tmp);
      } else {
          $str .= $tmp;
      }
    }
    return $str;
  }
  
  /**
   * 对字符串进行quoted_printable解码,适用于信头字段
   *
   * @param string $str
   * @return string 解码后的字符串
   */
  public static function Q_decode($str)
  {
    return quoted_printable_decode($str);
  }
  
  /**
   * 对字符串进行base64编码,适用于信头字段
   *
   * @param string $str
   * @return string 返回编码后的字符串
   */
  public static function B_encode($str)
  {
    return base64_encode($str);
  }
  
  /**
   * 对字符串进行base64解码,适用于信头字段
   *
   * @param string $str
   * @return string 返回解码后的字符串
   */
  public static function B_decode($str)
  {
    return base64_decode($str);
  }
  
  /**
   * 对信头字段的值进行rfc2047即(=?b?str?=)格式的编码
   *
   * @param string $str
   * @param string $charset 字符集
   * @param string $encode 编码方法 B or Q
   * @param string $header_len 信头字段本身的长度,用来控制其值的缩进
   * @return string 编码后的字符串
   */
  public static function rfc2047_encode($str , $charset = 'utf-8', $encode = 'quoted-printable', $header_len = 0)
  {
    if (strlen($str) <= 0) {
      return false;
    }
   
    switch ($encode)
    {
      case MIME::ENBASE64 :
        if (strlen('=?' . $charset . '?b?' . base64_encode($str) . '?=') + $header_len > 75) {
          $befor = MIME::rfc2047_encode(substr($str, 0, strlen($str) / 2), $charset, $encode, $header_len);
          $after = MIME::rfc2047_encode(substr($str, strlen($str) / 2), $charset, $encode);
          return $befor . "\r\n\t" . $after;
        } else {
          return '=?' . $charset . '?b?' . base64_encode($str) . '?=';
        }
        break;
        
      case MIME::ENQP :
        if (strlen('=?' . $charset . '?q?' . MIME::Q_encode($str) . '?=') + $header_len > 75) {
          $befor = MIME::rfc2047_encode(substr($str, 0, strlen($str) / 2), $charset, $encode, $header_len);
          $after = MIME::rfc2047_encode(substr($str, strlen($str) / 2), $charset, $encode);
          return $befor . "\r\n\t" . $after;
        } else {
          return '=?' . $charset . '?q?' . MIME::Q_encode($str) . '?=';
        }
        break;
        
      default :
        return false;
    }
  }
  
  /**
   * 对信头字段的值进行rfc2047即(=?b?str?=)格式的解码
   *
   * @param string $str
   * @return string 解码后的字符串
   */
  public static function rfc2047_decode($str)
  {
    if (preg_match_all('(=\?[^?]+\?[^?]\?[^?]+\?=)', $str, $header_array) <= 0) return false;
   
    $str = array();
    foreach ($header_array[0] as $tmp_header)
    {
      if (preg_match('=\?([^?]+)\?([^?])\?([^?]+)\?=', $tmp_header, $tmp_array) <= 0 || count($tmp_array) !== 4) {
        $tmp_str['str']     = $tmp_header;
        $tmp_str['charset'] = null;
        $str[] = $tmp_str;
      } else {
        if (strtolower($tmp_array[2]) === 'q') {
          $tmp_str['str']   = MIME::Q_decode($tmp_array[3]);
        } else if (strtolower($tmp_array[2]) === 'b') {
          $tmp_str['str']   = MIME::B_decode($tmp_array[3]);
        } else {
          $tmp_str['str']   = $tmp_array[3];
        }
        $tmp_str['charset'] = strtolower($tmp_array[1]);
        $str[] = $tmp_str;
      }
    }
    return $str;
  }
  
  /**
   * 检查邮件地址是否合法
   *
   * @param string $_email
   * @return boolean true 合法 || false 不合法
   */
  public static function check_email($_email)
  {
    $atom = '[-a-z0-9!#$%&*+/=?^_`{|}~]';
    $domain = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)';
    $regex = '^' . $atom . '+' . '(\.' . $atom . '+)*'. '@' . '(' . $domain . '{1,63}\.)+' . $domain . '{2,63}' . '$';
    return (eregi($regex, $_email) ? true : false);
  }

}

[/php]

angeloisme2008-3-3 02:26 AM
[color=Red]文件2/10 MIME_Entity.Class.php[/color]
[php]
/**
* MIME实体的抽象类,除了信头实体外其他实体都是由它派生而来
* @author 满鸿
* @version 1.0
* @abstract
*/
abstract class MIME_Entity
{
  /**
   * 实体支持的MIME版本
   * @var string
   */
  protected $MIME_Version;
  
  /**
   * 实体的MIME类型
   * @var string
   */
  protected $Content_Type;
  
  /**
   * 实体MIME类型字段的参数
   * @var array (param => value)
   */
  protected $Content_Type_parameter;

  public function __construct() {}
  
  /**
   * 创建一个具体的实体
   *
   * @param string $type 实体类型
   * @param string $parameter 创建实体需要的参数,默认null
   * @return object 实体对象
   */
  final public static function CreateEntity($type, $parameter = null)
  {
    switch ($type)
    {
      case MIME::SINGLE_ENTITY :
        return new MIME_Single_Entity;
        break;
      case MIME::RFC822HEADER_ENTITY :
        return new MIME_rfc822Header_Entity($parameter);
        break;
      case MIME::MULTIPART_ENTITY :
        return new MIME_Multipart_Entity;
        break;
      case MIME::RFC822MESSAGE_ENTITY :
        return new MIME_rfc822Message_Entity;
        break;
      case MIME::PARITALHEADER_ENTITY :
        return new MIME_ParitalHeader_Entity($parameter);
        break;
      case MIME::PARITALMESSAGE_ENTITY :
        return new MIME_PartialMessage_Entity;
        break;
      case MIME::EXTERNALBODY_ENTITY :
        return new MIME_ExternalBody_Entity;
        break;
      default :
        trigger_error(htmlspecialchars($type) . ' unknow type!' , E_USER_WARNING );
        return false;
        break;
    }
  }

  /**
   * 设置实体的MIME版本
   *
   * @param string $ver_no
   * @return boolean true 成功 || false 失败
   */
  public function set_MIME_Version($ver_no)
  {
    if (preg_match('/^[0-9]+\.[0-9]+$/', $ver_no)) {
      $this->MIME_Version = $ver_no;
      return true;
    } else {
      trigger_error( htmlspecialchars($ver_no) . ' is not be right mime-version!' , E_USER_WARNING );
      return false;
    }
  }

  /**
   * 取得实体MIME版本
   *
   * @return string 版本号的字符串
   */
  public function get_MIME_Version()
  {
    if (strlen($this->MIME_Version) > 0) {
      return $this->MIME_Version;
    } else {
      return false;
    }
  }

  /**
   * 设置实体的content-type(实体mime类型)字段
   *
   * @param string $type
   * @return boolean true 成功 || false 失败
   */
  public function set_Content_Type($type)
  {
    switch (strtolower($type))
    {
      case MIME::TEXT :
      case MIME::IMAGE :
      case MIME::AUDIO :
      case MIME::VIDEO :
      case MIME::APPLICATION :
      case MIME::MESSAGE :
      case MIME::MULTIPART :
      case MIME::TEXT_PLAIN :
      case MIME::TEXT_HTML :
      case MIME::TEXT_XML :
      case MIME::TEXT_RFC822_HEADERS :
      case MIME::IMAGE_GIF :
      case MIME::IMAGE_JPEG :
      case MIME::IMAGE_PNG :
      case MIME::IMAGE_BMP :
      case MIME::AUDIO_BASIC :
      case MIME::VIDEO_MPEG :
      case MIME::MESSAGE_RFC822 :
      case MIME::MESSAGE_PARTIAL :
      case MIME::MESSAGE_EXTERNAL_BODY :
      case MIME::MULTIPART_MIXED :
      case MIME::MULTIPART_ALTERNATIVE :
      case MIME::MULTIPART_DIGEST :
      case MIME::MULTIPART_PARALLEL :
      case MIME::MULTIPART_RELATED :
      case MIME::APPLICATION_OCTET_STREAM :
      case MIME::APPLICATION_MS_EXCEL :
      case MIME::APPLICATION_MS_WORD :
      case MIME::APPLICATION_X_GZIP :
      case MIME::APPLICATION_PDF :
      case MIME::APPLICATION_MS_PPT :
        $this->Content_Type = strtolower($type);
        break;
      default :
        trigger_error( htmlspecialchars($type) . ' is not be right content-type!' , E_USER_WARNING );
        return false;
    }
    return true;
  }

  /**
   * 取得实体MIME类型
   *
   * @return string MIME类型
   */
  public function get_Content_Type()
  {
    if (strlen($this->Content_Type) > 0) {
      return $this->Content_Type;
    } else {
      return false;
    }
  }

}

[/php]

angeloisme2008-3-3 02:28 AM
[color=Red]文件3/10 MIME_rfc822Header_Entity.Class.php[/color]
[php]
/**
* rfc822信头实体
* @author 满鸿
* @version 1.0
*/
class MIME_rfc822Header_Entity
{
  /**
   * 发件人地址数组
   * @var array(0 => array(name, address))
   */
  protected $From;
  /**
   * 发送者地址数组
   * @var array(0 => array(name, address))
   */
  protected $Sender;
  /**
   * 回复此邮件时用到的回复地址数组
   * @var array(0 => array(name, address))
   */
  protected $Reply_To;
  /**
   * 收件人地址数组
   * @var array(0 => array(name, address))
   */
  protected $To;
  /**
   * 抄送人地址数组
   * @var array(0 => array(name, address))
   */
  protected $Cc;
  /**
   * 暗送人地址数组
   * @var array(0 => array(name, address))
   */
  protected $Bcc;
  /**
   * 每封邮件唯一的message-id
   * @var string
   */
  protected $Message_ID;
  /**
   * 如果当前信件是对另一封信的回复,则为该信id
   * @var string
   */
  protected $In_Reply_To;
  /**
   * 保存相互回复的对话中信件的id数组
   * @var array
   */
  protected $References;
  /**
   * 信件撰写日期
   * @var string
   */
  protected $Date;
  /**
   * 再次分发时的发件人地址数组
   * @var array(0 => array(name, address))
   */
  protected $Resent_From;
  /**
   * 再次分发时的发送人地址数组
   * @var array(0 => array(name, address))
   */
  protected $Resent_Sender;
  /**
   * 再次分发时的收件人地址数组
   * @var array(0 => array(name, address))
   */
  protected $Resent_To;
  /**
   * 再次分发时的抄送人地址数组
   * @var array(0 => array(name, address))
   */
  protected $Resent_Cc;
  /**
   * 再次发送时的暗送人地址数组
   * @var array(0 => array(name, address))
   */
  protected $Resent_Bcc;
  /**
   * 再次发送时的撰写日期
   * @var string
   */
  protected $Resent_Date;
  /**
   * 再次分发时的新message_id
   * @var string
   */
  protected $Resent_Message_ID;
  /**
   * 再次分发时的回复人地址数组
   * @var array(0 => array(name, address))
   */
  protected $Resent_Reply_To;
  /**
   * 信件主题
   * @var string
   */
  protected $Subject;
  /**
   * 信件备注
   * @var string
   */
  protected $Comments;
  /**
   * 信件关键字
   * @var string
   */
  protected $Keywords;
  /**
   * 此邮件经过的地址,防止死循环
   * @var string
   */
  protected $X_Loop;
  /**
   * 撰写邮件的用户代理
   * @var string
   */
  protected $X_Mailer;
  /**
   * 邮件优先级
   * @var int
   */
  protected $X_Priority;
  /**
   * 邮件优先级字符串表示
   * @var string
   */
  protected $X_MSMail_Priotity;
  /**
   * 接受回执人的地址数组
   * @var array(name, address)
   */
  protected $Disposition_Notification_To;
  /**
   * 邮件信体,一般是一个MIME实体对象
   * @var object
   */
  protected $Body;
  
  /**
   * 类构造函数
   */
  public function __construct(MIME_rfc822Header_Entity $head = null)
  {
    if (!empty($head)) {
      $propertiy      = get_object_vars($head);
      $this_propertiy = get_object_vars($this);
      foreach ($propertiy as $key => $value)
      {
        if ($key == 'Body' || !array_key_exists ($key, $this_propertiy)) {
          continue;
        }
        $this->$key = $value;
      }
      return true;
    }
   
    $this->From            = array();
    $this->Sender          = array();
    $this->Reply_To        = array();
    $this->To              = array();
    $this->Cc              = array();
    $this->Bcc             = array();
    $this->Resent_From     = array();
    $this->Resent_Sender   = array();
    $this->Resent_To       = array();
    $this->Resent_Cc       = array();
    $this->Resent_Bcc      = array();
    $this->References      = array();
    $this->In_Reply_To     = array();
    $this->Resent_Reply_To = array();
    $this->Keywords        = array();
    $this->X_Loop          = array();
    $this->Disposition_Notification_To = array();
    return true;
  }
  
  /**
   * 给地址数组字段增加地址
   *
   * @param array $header
   * @param string $name
   * @param string $address
   * @return boolean true 成功 || false 失败
   */
  protected function _add_header_address(&$header, $name, $address)
  {
    if (strlen(strval($address)) <= 0) {
      trigger_error('empty address!' , E_USER_WARNING );
      return false;
    }
    /*
    else if (!MIME::check_email($address)){
      trigger_error(htmlspecialchars($address) . ' is error address!' , E_USER_WARNING );
      return false;
    }
    */
    else {
      $tmp_from['address'] = $address;
    }
    $tmp_from['name'] = strval($name);
    $header[]         = $tmp_from;
    return true;
  }
  
  /**
   * 取得地址数组字段的值
   *
   * @param array $header
   * @return mixed array || false 失败
   */
  protected function _get_header_address($header)
  {
    if (empty($header)) {
      return false;
    } else {
      return $header;
    }
  }

  /**
   * 重载函数
   * @param string $method
   * @param string $args
   */
  public function __call($method, $args)
  {
    switch (strtolower($method))
    {
      case 'add_from' :
        return $this->_add_header_address($this->From, $args[0], $args[1]);
        break;
      case 'get_from' :
        return $this->_get_header_address($this->From);
        break;
      case 'add_sender' :
        return $this->_add_header_address($this->Sender, $args[0], $args[1]);
        break;
      case 'get_sender' :
        return $this->_get_header_address($this->Sender);
        break;
      case 'add_reply_to' :
        return $this->_add_header_address($this->Reply_To, $args[0], $args[1]);
        break;
      case 'get_reply_to' :
        return $this->_get_header_address($this->Reply_To);
        break;
      case 'add_to' :
        return $this->_add_header_address($this->To, $args[0], $args[1]);
        break;
      case 'get_to' :
        return $this->_get_header_address($this->To);
        break;
      case 'add_cc' :
        return $this->_add_header_address($this->Cc, $args[0], $args[1]);
        break;
      case 'get_cc' :
        return $this->_get_header_address($this->Cc);
        break;
      case 'add_bcc' :
        return $this->_add_header_address($this->Bcc, $args[0], $args[1]);
        break;
      case 'get_bcc' :
        return $this->_get_header_address($this->Bcc);
        break;
      case 'add_resent_from' :
        return $this->_add_header_address($this->Resent_From, $args[0], $args[1]);
        break;
      case 'get_resent_from' :
        return $this->_get_header_address($this->Resent_From);
        break;
      case 'add_resent_sender' :
        return $this->_add_header_address($this->Resent_Sender, $args[0], $args[1]);
        break;
      case 'get_resent_sender' :
        return $this->_get_header_address($this->Resent_Sender);
        break;
      case 'add_resent_to' :
        return $this->_add_header_address($this->Resent_To, $args[0], $args[1]);
        break;
      case 'get_resent_to' :
        return $this->_get_header_address($this->Resent_To);
        break;
      case 'add_resent_cc' :
        return $this->_add_header_address($this->Resent_Cc, $args[0], $args[1]);
        break;
      case 'get_resent_cc' :
        return $this->_get_header_address($this->Resent_Cc);
        break;
      case 'add_resent_bcc' :
        return $this->_add_header_address($this->Resent_Bcc, $args[0], $args[1]);
        break;
      case 'get_resent_bcc' :
        return $this->_get_header_address($this->Resent_Bcc);
        break;
      case 'add_resent_reply_to' :
        return $this->_add_header_address($this->Resent_Reply_To, $args[0], $args[1]);
        break;
      case 'get_resent_reply_to' :
        return $this->_get_header_address($this->Resent_Reply_To);
        break;
      default :
        trigger_error('unkow method!' , E_USER_WARNING);
        break;
    }
  }
  
  /**
   * 设置需要受到以读回执的地址
   *
   * @param string $name
   * @param string $address
   * @return boolean true 成功 || false 失败
   */
  public function set_Disposition_Notification_To($name, $address)
  {
    if (strlen(strval($address)) <= 0) {
      trigger_error('empty address!' , E_USER_WARNING );
      return false;
    } else if (!MIME::check_email($address)){
      trigger_error(htmlspecialchars($address) . ' is error address!' , E_USER_WARNING );
      return false;
    } else {
      $tmp_from['address'] = $address;
    }
    $tmp_from['name'] = strval($name);
    $this->Disposition_Notification_To = $tmp_from;
    return true;
  }
  
  /**
   * 取得需要受到回执的地址
   *
   * @return mixed array || false 失败
   */
  public function get_Disposition_Notification_To()
  {
    if (empty($this->Disposition_Notification_To)) {
      return false;
    } else {
      return $this->Disposition_Notification_To;
    }
  }
  
  /**
   * 设置信件唯一的id
   *
   * @param string $id
   * @param string $flag 附加信息
   * @return boolean true
   */
  public function set_Message_ID($id = null, $flag = null)
  {
    if ($id !== null) {
      $this->Message_ID = $id;
      return true;
    }
    if ($flag === null || strlen($flag) <= 0) $flag = 'Mail.MMOneDayPost.com';
    $time = explode(' ' , microtime());
    $this->Message_ID = date('YmdHis', $time[1]) . strval($time[0]) . '@' . $flag;
    return true;
  }
  
  /**
   * 取得信件唯一的id
   *
   * @return mixed string || false 失败
   */
  public function get_Message_ID()
  {
    if (strlen($this->Message_ID) > 0) {
      return $this->Message_ID;
    } else {
      return false;
    }
  }
  
  /**
   * 设置再次分发中的message-id
   *
   * @param string $id
   * @param string $flag 附加信息
   * @return true
   */
  public function set_Resent_Message_ID($id = null, $flag = null)
  {
    if ($id !== null) {
      $this->Resent_Message_ID = $id;
      return true;
    }
    if ($flag === null || strlen($flag) <= 0) $flag = 'Mail.MMOneDayPost.com';
    $time = explode(' ' , microtime());
    $this->Resent_Message_ID = date('YmdHis', $time[1]) . strval($time[0]) . '@' . $flag;
    return true;
  }
  
  /**
   * 取得再次分发中的message-id
   *
   * @return mixed string || false 失败
   */
  public function get_Resent_Message_ID()
  {
    if (strlen($this->Resent_Message_ID) > 0) {
      return $this->Resent_Message_ID;
    } else {
      return false;
    }
  }
  
  /**
   * 设置回复信件的id
   *
   * @param string $message 备注
   * @param string $id
   * @return boolean true 成功 || false 失败
   */
  public function set_In_Reply_To($message, $id)
  {
    if (strlen(strval($message)) > 0) {
      $this->In_Reply_To['message'] = strval($message);
    }
    if (strlen(strval($message)) > 0) {
      $this->In_Reply_To['id'] = strval($id);
    }
    if (!empty($this->In_Reply_To)) {
      return true;
    } else {
      trigger_error('error message and id!' , E_USER_WARNING );
      return false;
    }
  }
  
  /**
   * 取得回复信件的id
   *
   * @return mixed string || false 失败
   */
  public function get_In_Reply_To()
  {
    if (empty($this->In_Reply_To)) {
      return false;
    } else {
      return $this->In_Reply_To;
    }
  }

  /**
   * 增加回复线索中的message-id
   *
   * @param string $id
   * @return boolean true 成功 || false 失败
   */
  public function set_References($id)
  {
    if (strlen(strval($id)) > 0) {
      $this->References[] = $id;
      return true;
    } else {
      trigger_error('error id!' , E_USER_WARNING );
      return false;
    }
  }
  
  /**
   * 取得回复线索中的message-id
   *
   * @return mixed array || false 失败
   */
  public function get_References()
  {
    if (empty($this->References)) {
      return false;
    } else {
      return $this->References;
    }
  }
  
  /**
   * 设置邮件撰写时间
   *
   * @param int $time 时间戳
   * @return boolean true 成功 || false 失败
   */
  public function set_Date($time = null)
  {
    if (null === $time || false === $time) {
      $this->Date = date('r');
      return true;
    } else if(is_int($time)) {
      $this->Date = date('r' , $time);
      return true;
    } else if(is_string($time)){
      if (false === ($tmp_time = strtotime($time))) {
        trigger_error('error time!' , E_USER_WARNING );
        return false;
      } else {
        $this->Date = date('r', $tmp_time);
        return true;
      }
    } else {
      trigger_error('error time!' , E_USER_WARNING );
      return false;
    }
  }
  
  /**
   * 取得信件撰写的日期
   *
   * @return mixed array || false 失败
   */
  public function get_Date()
  {
    if (strlen($this->Date) > 0) {
      return $this->Date;
    } else {
      return false;
    }
  }
  
  /**
   * 设置再次发送中的邮件撰写日期
   *
   * @param int $time 时间戳
   * @return boolean true 成功 || false 失败
   */
  public function set_Resent_Date($time = null)
  {
    if (null === $time || false === $time) {
      $this->Resent_Date = date('r');
      return true;
    } else if(is_int($time)) {
      $this->Resent_Date = date('r' , $time);
      return true;
    } else if(is_string($time)){
      if (false === ($tmp_time = strtotime($time))) {
        trigger_error('error time!' , E_USER_WARNING );
        return false;
      } else {
        $this->Resent_Date = date('r', $tmp_time);
        return true;
      }
    } else {
      trigger_error('error time!' , E_USER_WARNING );
      return false;
    }
  }
  
  /**
   * 取得再次发送中的邮件撰写时间
   *
   * @return mixed string || false 失败
   */
  public function get_Resent_Date()
  {
    if (strlen($this->Resent_Date) > 0) {
      return $this->Resent_Date;
    } else {
      return false;
    }
  }

  /**
   * 设置信件主题
   * @param string $subject
   * @return boolean true 成功 || false 失败
   */
  public function set_Subject($subject)
  {
    if (strlen(strval($subject)) > 0) {
      $this->Subject = strval($subject);
      return true;
    } else {
      trigger_error('error subject!' , E_USER_WARNING );
      return false;
    }
  }
  
  /**
   * 取得信件主题
   *
   * @return mixed string || false 失败
   */
  public function get_Subject()
  {
    if (strlen($this->Subject) > 0) {
      return $this->Subject;
    } else {
      return false;
    }
  }
  
  /**
   * 设置信件备注
   *
   * @param string $comments
   * @return boolean true 成功 || false 失败
   */
  public function set_Comments($comments)
  {
    if (strlen(strval($comments)) > 0) {
      $this->Comments = strval($comments);
      return true;
    } else {
      trigger_error('error comments!' , E_USER_WARNING );
      return false;
    }
  }
  
  /**
   * 取得信件备注
   *
   * @return mixed string || false 失败
   */
  public function get_Comments()
  {
    if (strlen($this->Comments) > 0) {
      return $this->Comments;
    } else {
      return false;
    }
  }
  
  /**
   * 增加信件关键字
   *
   * @param string $key
   * @return boolean true 成功 || false 失败
   */
  public function add_Keywords($key)
  {
    if (strlen($key) > 0) {
      $this->Keywords[] = $key;
      return true;
    } else {
      trigger_error('error keywords!' , E_USER_WARNING );
      return false;
    }
  }
  
  /**
   * 取得信件关键字数组
   *
   * @return mixed array || false 失败
   */
  public function get_Keywords()
  {
    if (empty($this->Keywords)) {
      return false;
    } else {
      return $this->Keywords;
    }
  }
  
  /**
   * 设置邮件经过地址
   *
   * @param string $address
   * @return boolean true 成功 || false 失败
   */
  public function set_X_Loop($address)
  {
    if (strlen(strval($address)) <= 0) {
      trigger_error('empty address!' , E_USER_WARNING );
      return false;
    } else if (!MIME::check_email($address)){
      trigger_error(htmlspecialchars($address) . ' is error address!' , E_USER_WARNING);
      return false;
    } else {
      $this->X_Loop[] = $address;
      return true;
    }
  }
  
  /**
   * 取得所有经过地址的数组
   *
   * @return mixed array || false 失败
   */
  public function get_X_Loop()
  {
    if (!empty($this->X_Loop)) {
      return $this->X_Loop;
    } else {
      return false;
    }
  }
  
  /**
   * 设置撰写邮件的用户代理
   *
   * @param string $mailer
   * @return
   */
  public function set_X_Mailer($mailer)
  {
    if (strlen($mailer) > 0) {
      $this->X_Mailer = $mailer;
    } else {
      trigger_error('error mailer!' , E_USER_WARNING );
      return false;
    }
    return true;
  }
  
  /**
   * 取得撰写邮件的用户代理
   *
   * @return mixed array || false 失败
   */
  public function get_X_Mailer()
  {
    if (strlen($this->X_Mailer) > 0) {
      return $this->X_Mailer;
    } else {
      return false;
    }
  }
  
  /**
   * 设置数字表示的信件优先级
   *
   * @param int $priority
   * @return boolean true 成功 || false 失败
   */
  public function set_X_Priority($priority)
  {
    switch ($priority)
    {
      case MIME::PRIOTITY_1 :
      case MIME::PRIOTITY_2 :
      case MIME::PRIOTITY_3 :
      case MIME::PRIOTITY_4 :
      case MIME::PRIOTITY_5 :
        $this->X_Priority = $priority;
        return true;
      default :
        trigger_error('error priority!' , E_USER_WARNING );
        return false;
    }
  }
  
  /**
   * 取得数字表示的优先级
   *
   * @return mixed int || false 失败
   */
  public function get_X_Priority()
  {
    switch ($this->X_Priority)
    {
      case MIME::PRIOTITY_1 :
      case MIME::PRIOTITY_2 :
      case MIME::PRIOTITY_3 :
      case MIME::PRIOTITY_4 :
      case MIME::PRIOTITY_5 :
        return $this->X_Priority;
      default :
        return false;
    }
  }
  
  /**
   * 设置字符串表示的信件优先级
   *
   * @param int $priority
   * @return boolean true || false
   */
  public function set_X_MSMail_Priotity($priority)
  {
    switch ($priority)
    {
      case MIME::PRIOTITY_1 :
      case MIME::PRIOTITY_2 :
        $this->X_MSMail_Priotity = 'Low';
        return true;
      case MIME::PRIOTITY_3 :
        $this->X_MSMail_Priotity = 'Normal';
        return true;
      case MIME::PRIOTITY_4 :
      case MIME::PRIOTITY_5 :
        $this->X_MSMail_Priotity = 'High';
        return true;
      default :
        trigger_error('error priority!' , E_USER_WARNING );
        return false;
    }
  }
  
  /**
   * 取得字符串表示的信件优先级
   *
   * @return mixed string || false 失败
   */
  public function get_X_MSMail_Priotity()
  {
    if (strlen($this->X_MSMail_Priotity) > 0) {
      return $this->X_MSMail_Priotity;
    } else {
      return false;
    }
  }
  
  /**
   * 设置信体
   *
   * @param MIME_Entity $body
   */
  final public function set_Body(MIME_Entity $body)
  {
    $this->Body = $body;
  }
  
  /**
   * 取得信体实体
   *
   * @return MIME_Entity
   */
  final public function get_Body()
  {
    if (is_a($this->Body, 'MIME_Entity')) {
      return $this->Body;
    } else {
      return false;
    }
  }
  
  /**
   * 格式化邮件地址为 "name" <name@domain> 形式
   *
   * @param array $tmp_array 地址信息数组
   * @param string $header 信头字段
   * @param string $charset 字符集
   * @param string $encode 编码方式
   * @return string 格式化后的字符串
   */
  protected function _encode_header_address($tmp_array, $header, $charset, $encode)
  {
    $tmp_str = '';
    foreach ($tmp_array as $tmp)
    {
      $tmp_str .= ($tmp_str === '' ? '' : ',' . chr(13) . chr(10) . "\t")
      . ((strlen($tmp['name']) <= 0) ? '' :
        '"' . MIME::rfc2047_encode($tmp['name'], $charset, $encode, $tmp_str === '' ? 25 : 0) . '"')
      .  ' <' . $tmp['address'] . '>';
    }
    return $header . $tmp_str . chr(13) . chr(10);
  }
  
  /**
   * 编制信头和信体生成新信
   *
   * @param string $charset
   * @param string $encode
   * @return string 新信内容
   */
  public function encode_Entity($charset, $encode)
  {
    $entity = '';
    if ($tmp_str = $this->get_Resent_Date()) {
      $entity .= 'Resent-Date:"' . $tmp_str . '"' . chr(13) . chr(10);
    }

    if ($tmp_array = $this->get_Resent_From()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Resent-From:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Resent_Sender()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Resent-Sender:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Resent_Reply_To()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Resent-Reply-To:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Resent_To()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Resent-To:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Resent_Cc()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Resent-Cc:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Resent_Bcc()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Resent-Bcc:', $charset, $encode);
    }
   
    if ($tmp_str = $this->get_Resent_Message_ID()) {
      $entity .= 'Resent-Message-ID:<' . $tmp_str . '>' . chr(13) . chr(10);
    }
   
    if ($tmp_str = $this->get_Date()) {
      $entity .= 'Date:"' . $tmp_str . '"' . chr(13) . chr(10);
    }
   
    if ($tmp_array = $this->get_From()) {
      $entity .= $this->_encode_header_address($tmp_array, 'From:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Sender()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Sender:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Reply_To()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Reply-To:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_To()) {
      $entity .= $this->_encode_header_address($tmp_array, 'To:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Cc()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Cc:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Bcc()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Bcc:', $charset, $encode);
    }
   
    if ($tmp_str = $this->get_Subject()) {
      $entity .= 'Subject:' . MIME::rfc2047_encode($tmp_str, $charset, $encode, 8) . chr(13) . chr(10);
    }
   
    if ($tmp_str = $this->get_Comments()) {
      $entity .= 'Comments:' . MIME::rfc2047_encode($tmp_str, $charset, $encode, 9) . chr(13) . chr(10);
    }
   
    if ($tmp_str = $this->get_Message_ID()) {
      $entity .= 'Message-ID:<' . $tmp_str . '>' . chr(13) . chr(10);
    }
   
    if ($tmp_array = $this->get_Keywords()) {
      $tmp_str = '';
      foreach ($tmp_array as $tmp)
      {
        $tmp_str .= ($tmp_str === '' ? '' : ',' . chr(13) . chr(10) . "\t")
                 .  MIME::rfc2047_encode($tmp, $charset, $encode, ($tmp_str === '' ? 10 : 0));
      }
      $entity .= 'Keywords:' . $tmp_str . chr(13) . chr(10);
    }
   
    if ($tmp_array = $this->get_X_Loop()) {
      $tmp_str = '';
      foreach ($tmp_array as $tmp)
      {
        $tmp_str .= ($tmp_str === '' ? '' : ',' . chr(13) . chr(10) . "\t") . $tmp;
      }
      $entity .= 'X-Loop:' . $tmp_str . chr(13) . chr(10);
    }

    if ($tmp_str = $this->get_X_Mailer()) {
      $entity .= 'X-Mailer:' . $tmp_str . chr(13) . chr(10);
    }
   
    if ($tmp_str = $this->get_X_Priority()) {
      $entity .= 'X-Priority:' . $tmp_str . chr(13) . chr(10);
    }
   
    if ($tmp_str = $this->get_X_MSMail_Priotity()) {
      $entity .= 'X-MSMail-Priotity:' . $tmp_str . chr(13) . chr(10);
    }
   
    if ($tmp = $this->get_Disposition_Notification_To()) {
      $entity .= 'Disposition-Notification-To:' . '"' . MIME::rfc2047_encode($tmp['name'], $charset, $encode, 35) . '"'
                                                . ' <' . $tmp['address'] . '>' . chr(13) . chr(10);
    }
   
    if ($tmp_array = $this->get_In_Reply_To()) {
      if (empty($tmp_array['message'])) {
        $tmp_str = '';
      } else {
        $tmp_str = MIME::rfc2047_encode($tmp_array['message'], $charset, $encode, 16);
      }
      if (!empty($tmp_array['id'])) {
        $tmp_str .= ($tmp_str === '' ? '' : chr(13) . chr(10) . "\t") . '<' . $tmp_array['id'] . '>';
      }
      $entity .= 'In-Reply-To:' . $tmp_str . chr(13) . chr(10);
    }
   
    if ($tmp_array = $this->get_References()) {
      $tmp_str = '';
      foreach ($tmp_array as $tmp)
      {
        $tmp_str .= ($tmp_str === '' ? '' : chr(13) . chr(10) . "\t") . '<' . $tmp . '>';
      }
      $entity .= 'References:' . $tmp_str . chr(13) . chr(10);
    }
   
    if (is_object($this->Body)) {
      return $entity .= $this->Body->encode_Entity($charset, $encode);
    } else {
      trigger_error('Body not found!' , E_USER_WARNING );
      return false;
    }
  }
  
  /**
   * 分割整封信,并生成邮件分割实体
   *
   * @param int $length 每个分割实体的字节长度
   * @param string $charset
   * @param string $encode
   * @return MIME_ParitalHeader_Entity 分割成单位大小的新信
   */
  final public function split_Entity($length, $charset, $encode)
  {
    $length *= 1024;
    $originality_mail = $this->Body->encode_Entity($charset, $encode);
    $sub_mail = array();
    $tmp_str  = '';
    $originality_mail = explode(chr(13) . chr(10), $originality_mail);
    foreach ($originality_mail as $tmp)
    {
      $tmp_str .= $tmp . chr(13) . chr(10);
      if (strlen($tmp_str) >= $length) {
        $sub_mail[] = $tmp_str;
        $tmp_str    = '';
      }
    }
    $sub_mail[] = $tmp_str;
   
    $new_head = MIME_Entity::CreateEntity(MIME::PARITALHEADER_ENTITY, $this);
   
    $total      = count($sub_mail);
    $tmp_object = null;
    foreach ($sub_mail as $key => $tmp)
    {
      $tmp_object = MIME_Entity::CreateEntity(MIME::PARITALMESSAGE_ENTITY);
      $tmp_object->set_Content_Type_Partial_Id();
      $tmp_object->set_Content_Type(MIME::MESSAGE_PARTIAL);
      $tmp_object->set_Content_Type_Partial_Number($key + 1);
      $tmp_object->set_Content_Type_Partial_Total($total);
      if ($key == 0) {
        $tmp_object->set_Original_Header_Message_ID($this->Message_ID);
        $tmp_object->set_Original_Header_Subject($this->Subject);
      }
      $tmp_object->set_Body($tmp);
      
      $new_head->Add_Parital_Entity($tmp_object);
      $tmp_object = null;
    }
    return $new_head;
  }
  
}
[/php]

angeloisme2008-3-3 02:29 AM
[color=Red]文件4/10 MIME_Single_Entity.Class.php[/color]
[php]
/**
* 单部件实体类
*
* @author 满鸿
* @version 1.0
*/
class MIME_Single_Entity extends MIME_Entity
{
  /**
   * 实体内容的编码方式
   * @var string
   **/
  protected $Content_Transfer_Encoding;
  /**
   * 实体唯一的id
   * @var string
   **/
  protected $Content_ID;
  /**
   * 实体描述
   * @var string
   **/
  protected $Content_Description;
  /**
   * 实体表示方式:附件,内联显示
   * @var string
   **/
  protected $Content_Disposition;
  /**
   * 实体表示方式的参数
   * @var array(0 => array(name, value))
   */
  protected $Content_Disposition_parameter;
  //protected $Content_MD5;
  /**
   * 实体使用的语言
   * @var string
   **/
  protected $Content_Language;
  /**
   * 实体内容
   * @var bit
   **/
  protected $Body;
  /**
   * 所有单部件实体个数的计数
   * @var int
   */
  protected static $Content_ID_no;
  
  /**
   * 类构造函数
   **/
  public function __construct()
  {
    $this->Body = '';
    MIME_Single_Entity::$Content_ID_no = 1;
  }
  
  /**
   * 设置实体MIME类型
   * @param string
   * @return boolean true 成功 || false 失败
   **/
  public function set_Content_Type($type)
  {
    switch (strtolower($type))
    {
      case MIME::TEXT :
      case MIME::IMAGE :
      case MIME::AUDIO :
      case MIME::VIDEO :
      case MIME::APPLICATION :
      case MIME::TEXT_PLAIN :
      case MIME::TEXT_HTML :
      case MIME::TEXT_XML :
      case MIME::TEXT_RFC822_HEADERS :
      case MIME::IMAGE_GIF :
      case MIME::IMAGE_JPEG :
      case MIME::IMAGE_PNG :
      case MIME::IMAGE_BMP :
      case MIME::AUDIO_BASIC :
      case MIME::VIDEO_MPEG :
      case MIME::MESSAGE_RFC822 :
      case MIME::MESSAGE_PARTIAL :
      case MIME::MESSAGE_EXTERNAL_BODY :
      case MIME::APPLICATION_OCTET_STREAM :
      case MIME::APPLICATION_MS_EXCEL :
      case MIME::APPLICATION_MS_WORD :
      case MIME::APPLICATION_X_GZIP :
      case MIME::APPLICATION_PDF :
      case MIME::APPLICATION_MS_PPT :
        $this->Content_Type = strtolower($type);
        break;
      default :
        trigger_error( htmlspecialchars($type) . ' is not be right content-type!' , E_USER_WARNING );
        return false;
    }
    return true;
  }
  
  /**
   * 设置实体内容编码方式
   * @param string
   * @return boolean true 成功 || false 失败
   **/
  public function set_Content_Transfer_Encoding($encode)
  {
    switch (strtolower($encode))
    {
      case MIME::EN7BIT :
      case MIME::EN8BIT :
      case MIME::ENBINARY :
      case MIME::ENBASE64 :
      case MIME::ENQP :
        $this->Content_Transfer_Encoding = strtolower($encode);
        break;
      default :
        trigger_error( htmlspecialchars($encode) . ' is not be right content-transfer-encoding!' , E_USER_WARNING );
        return false;
    }
    return true;
  }

  /**
   * 取得实体内容的编码方式
   * @return mixed string || false 失败
   **/
  public function get_Content_Transfer_Encoding()
  {
    if (strlen($this->Content_Transfer_Encoding) > 0) {
      return $this->Content_Transfer_Encoding;
    } else {
      return false;
    }
  }

  /**
   * 设置实体id
   * @param string $id
   * @param string $flag
   * @return boolean true 成功 || false 失败
   */
  public function set_Content_ID($id = null, $flag = null)
  {
    if ($id !== null) {
      $this->Content_ID = $id;
      return true;
    }
    if ($flag === null || strlen($flag) <= 0) $flag = 'Mail.MMOneDayPost.com';
    $time = explode(' ' , microtime());
    $this->Content_ID = date('YmdHis', $time[1]) . strval($time[0]) . '.' . MIME_Single_Entity::$Content_ID_no . '@' . $flag;
    MIME_Single_Entity::$Content_ID_no += 1;
    return true;
  }

  /**
   * 取得实体id
   * @return string || false 失败
   */
  public function get_Content_ID()
  {
    if (strlen($this->Content_ID) > 0) {
      return $this->Content_ID;
    } else {
      return false;
    }
  }

  /**
   * 设置实体描述
   * @param string $desc
   * @return true
   */
  public function set_Content_Description($desc)
  {
    $this->Content_Description = strval($desc);
    return true;
  }

  /**
   * 取得实体描述
   * @return string || false 失败
   */
  public function get_Content_Description()
  {
    if (strlen($this->Content_Description) > 0) {
      return $this->Content_Description;
    } else {
      return false;
    }
  }

  /**
   * 设置实体显示方式
   * @param string $disp
   * @return true 成功 || false 失败
   */
  public function set_Content_Disposition($disp)
  {
    switch (strtolower($disp))
    {
      case MIME::ATTACHMENT :
      case MIME::INLINE :
        $this->Content_Disposition = strtolower($disp);
        break;
      default :
        trigger_error( htmlspecialchars($disp) . ' is not be right content_disposition!' , E_USER_WARNING );
        return false;
    }
    return true;
  }

  /**
   * 取得实体显示方式
   * @return string || false 失败
   */
  public function get_Content_Disposition()
  {
    if (strlen($this->Content_Disposition) > 0) {
      $tmp_str = $this->Content_Disposition;
    } else {
      return false;
    }
    return $tmp_str;
  }

  /**
   * 设置实体语言
   * @param string $language
   * @return true
   */
  public function set_Content_Language($language)
  {
    $this->Content_Language = trim(strtolower($language));
    return true;
  }

  /**
   * 取得实体语言
   * @return string || false 失败
   */
  public function get_Content_Language()
  {
    if (strlen($this->Content_Language) > 0) {
      return $this->Content_Language;
    } else {
      return false;
    }
  }

  /**
   * 设置实体内容
   * @param string $body 实体内容或存有内容的文件的路径
   * @param boolean $is_path 是否从文件中取得
   * @return boolean true 成功 || false 失败
   */
  public function set_Body($body, $is_path = false)
  {
    if ($is_path) {
      if ($this->Body = file_get_contents($body)) {
        return true;
      } else {
        $this->Body = '';
        return false;
      }
    } else {
      $this->Body = $body;
      return true;
    }
  }

  /**
   * 取得实体内容
   * @return string || false 失败
   */
  public function get_Body()
  {
    if (strlen($this->Body) > 0) {
      return $this->Body;
    } else {
      return false;
    }
  }
  
  /**
   * 设置实体字符集
   * @param string $charset
   * @return boolean true 成功 || false 失败
   */
  public function set_Content_Type_CharSet($charset)
  {
    $this->Content_Type_parameter['charset'] = trim(strtolower($charset));
    return true;
  }
  
  /**
   * 取得实体字符集
   * @return string || false 失败
   */
  public function get_Content_Type_CharSet()
  {
    if (strlen($this->Content_Type_parameter['charset']) > 0) {
      return $this->Content_Type_parameter['charset'];
    } else {
      return false;
    }
  }
  
  /**
   * 设置实体文件名(Content_Type 字段参数)
   * @param string $name
   * @return boolean true 成功 || false 失败
   */
  public function set_Content_Type_Name($name)
  {
    if (!preg_match('/^\..*/', $tmp_str = trim($name))) {
      $this->Content_Type_parameter['name'] = preg_replace('/[\'\"<>]/', '_', $tmp_str);
      return true;
    } else {
      trigger_error(htmlspecialchars($name) . ' is not be right name!' , E_USER_WARNING);
      return false;
    }
  }
  
  /**
   * 取得实体文件名(Content_Type 字段参数)
   * @return mixed string || false 失败
   */
  public function get_Content_Type_Name()
  {
    if (strlen($this->Content_Type_parameter['name']) > 0) {
      return $this->Content_Type_parameter['name'];
    } else {
      return false;
    }
  }
  
  /**
   * 设置实体文件名(Content_Disposition 字段参数)
   * @param string $filename
   * @return boolean true 成功 || false 失败
   */
  public function set_Content_Disposition_Filename($filename)
  {
    if (!preg_match('/^\..*/', $tmp_str = trim($filename))) {
      $this->Content_Disposition_parameter['filename'] = preg_replace('/[\'\"<>]/', '_', $tmp_str);
      return true;
    } else {
      trigger_error(htmlspecialchars($filename) . ' is not be right filename!' , E_USER_WARNING );
      return false;
    }
  }
  
  /**
   * 取得实体文件名(Content_Disposition 字段参数)
   *
   * @return mixed string || false 失败
   */
  public function get_Content_Disposition_Filename()
  {
    if (strlen($this->Content_Disposition_parameter['filename']) > 0) {
      return $this->Content_Disposition_parameter['filename'];
    } else {
      return false;
    }
  }
  
  /**
   * 设置实体大小,字节单位(Content_Disposition 字段参数)
   *
   * @param int $size
   * @return boolean true 成功 || false 失败
   */
  public function set_Content_Disposition_Size($size)
  {
    if (preg_match('/^[0-9]+$/', trim(strval($size)))) {
      $this->Content_Disposition_parameter['size'] = trim(strval($size));
      return true;
    } else {
      trigger_error(htmlspecialchars($size) . ' is not be right size!' , E_USER_WARNING );
      return false;
    }
  }
  
  /**
   * 取得实体大小,字节单位(Content_Disposition 字段参数)
   *
   * @return int
   */
  public function get_Content_Disposition_Size()
  {
    if (strlen($this->Content_Disposition_parameter['size']) > 0) {
      return $this->Content_Disposition_parameter['size'];
    } else {
      return false;
    }
  }
  
  /**
   * 编码实体
   *
   * @param string $charset 字符集
   * @param string $encode 编码方法
   * @return mixed string || false 失败
   */
  public function encode_Entity($charset, $encode)
  {
    $entity = '';
    if ($tmp_str = $this->get_MIME_Version()) {
      $entity .= 'MIME-Version:' . $tmp_str . chr(13) . chr(10);
    }
   
    if ($tmp_str = $this->get_Content_Type()) {
      $entity .= 'Content-Type:' . $tmp_str;
    } else {
      trigger_error('Content-Type not found!' , E_USER_WARNING );
      return false;
    }
   
    if (is_array($this->Content_Type_parameter) && count($this->Content_Type_parameter) > 0) {
      foreach ($this->Content_Type_parameter as $key => $tmp_parameter)
      {
        switch ($key)
        {
          case 'name' :
            $tmp_str = MIME::rfc2047_encode($tmp_parameter, $charset, $encode, 5);
            break;
          default :
            $tmp_str = $tmp_parameter;
            break;
        }
        $entity .= ';' . chr(13) . chr(10) ."\t$key=\"" . $tmp_str . "\"";
      }
    }
    $entity .= chr(13) . chr(10);
   
    if ($tmp_str = $this->get_Content_Transfer_Encoding()) {
      $entity .= 'Content-Transfer-Encoding:' . $tmp_str . chr(13) . chr(10);
    } else {
      trigger_error('Content-Transfer-Encoding not found!' , E_USER_WARNING );
      return false;
    }

    if ($tmp_str = $this->get_Content_Disposition()) {
      $entity .= 'Content-Disposition:' . $tmp_str;   
      if (is_array($this->Content_Disposition_parameter) && count($this->Content_Disposition_parameter) > 0) {
        foreach ($this->Content_Disposition_parameter as $key => $tmp_parameter)
        {
          switch ($key)
          {
            case 'filename' :
              $tmp_str = MIME::rfc2047_encode($tmp_parameter, $charset, $encode, 9);
              break;
            default :
              $tmp_str = $tmp_parameter;
              break;
          }
          $entity .= ';' . chr(13) . chr(10) . "\t$key=\"" . $tmp_str . "\"";
        }
      }
      $entity .= chr(13) . chr(10);
    }
   
    if ($tmp_str = $this->get_Content_Language()) {
      $entity .= 'Content-Language:' . $tmp_str . chr(13) . chr(10);
    }
   
    if ($tmp_str = $this->get_Content_ID()) {
      $entity .= 'Content-ID:<' . $tmp_str . '>' . chr(13) . chr(10);
    }
   
    if ($tmp_str = $this->get_Content_Description()) {
      $entity .= 'Content-Description:"' . MIME::rfc2047_encode($tmp_str, $charset, $encode, 21) . '"' . chr(13) . chr(10);
    }
   
    if ('' === $this->Body) {
      trigger_error('Body not found!' , E_USER_WARNING );
      return false;
    }
   
    switch ($this->Content_Transfer_Encoding)
    {
      case MIME::EN7BIT :
      case MIME::EN8BIT :
      case MIME::ENBINARY :
        $tmp_str = chunk_split($this->Body);
        break;
      case MIME::ENBASE64 :
        $tmp_str = chunk_split(base64_encode($this->Body));
        break;
      case MIME::ENQP :
        $tmp_str = MIME::quoted_printable_encode($this->Body);
        break;
      default :
        break;
    }
    $entity.= chr(13) . chr(10) . $tmp_str;
    return $entity;
  }
  
}

[/php]

angeloisme2008-3-3 02:30 AM
[color=red]文件5/10 MIME_Multipart_Entity.Class.php[/color]
[php]
/**
* 多部件实体类
*
* @author 满鸿
* @version 1.0
*/
class MIME_Multipart_Entity extends MIME_Entity
{
  /**
   * 多部件实体中包含的其他实体的数组
   *
   * @var array
   */
  protected $Sub_MIME_Entity;
  
  /**
   * 类构造函数
   */
  public function __construct()
  {
    $this->Sub_MIME_Entity = array();  
  }
  
  /**
   * 设置实体MIME类型
   *
   * @param string $type
   * @return boolean true 成功 || false 失败
   */
  public function set_Content_Type($type)
  {
    switch (strtolower($type))
    {
      case MIME::MULTIPART :
      case MIME::MULTIPART_MIXED :
      case MIME::MULTIPART_ALTERNATIVE :
      case MIME::MULTIPART_DIGEST :
      case MIME::MULTIPART_PARALLEL :
      case MIME::MULTIPART_RELATED :
        $this->Content_Type = strtolower($type);
        break;
      default :
        trigger_error( htmlspecialchars($type) . ' is not be right content-type!' , E_USER_WARNING );
        return false;
    }
    return true;
  }
  
  /**
   * 设置实体之间的分割符(boundary)
   *
   * @param string $boundary
   * @return boolean true 成功 || false 失败
   */
  public function set_Content_Type_Boundary($boundary = '--NextPart-with-MMOneDayPost--')
  {
   if (false !== [code]preg_match('/^[a-zA-Z0-9\134\047\050\051\053\055\054\137\056\057\072\075\077]{1,70}$/', $boundary)[/code]) {
      $this->Content_Type_parameter['boundary'] = $boundary;
      return true;
    } else {
      trigger_error(htmlspecialchars($boundary) . ' is not be right boundary!' , E_USER_WARNING);
      return false;
    }
  }
  
  /**
   * 设置实体显示的优先级
   *
   * @param string $differences
   * @return boolean true 成功 || false 失败
   */
  public function set_Content_Type_Differences($differences)
  {
    switch ($differences)
    {
      case MIME::TYPE :
        $this->Content_Type_parameter['differences'] = 'Content-Type';
        break;
      case MIME::LANGUAGE :
        $this->Content_Type_parameter['differences'] = 'Content-Language';
        break;
      default :
        trigger_error(htmlspecialchars($differences) . ' is not be right differences!' , E_USER_WARNING);
        return false;
    }
    return true;
  }

  /**
   * 取得实体显示的优先级
   *
   * @return mixed string || false 失败
   */
  public function get_Content_Type_Differences()
  {
    if (isset($this->Content_Type_parameter['differences']) && strlen($this->Content_Type_parameter['differences']) > 0) {
      return $this->Content_Type_parameter['differences'];
    } else {
      return false;
    }
  }
  
  /**
   * 增加子实体
   *
   * @param MIME_Entity $entity
   */
  public function Add_Sub_Entity(MIME_Entity $entity)
  {
    $this->Sub_MIME_Entity[] = $entity;
  }
  
  /**
   * 取得子实体的数组
   *
   * @return mixed array || false 失败
   */
  public function get_Sub_Entity()
  {
    if (empty($this->Sub_MIME_Entity)) {
      return false;
    } else {
      return $this->Sub_MIME_Entity;
    }
  }
  
  /**
   * 编码实体
   *
   * @param string $charset 字符集
   * @param string $encode 编码方法
   * @return mixed string || false 失败
   */
  public function encode_Entity($charset, $encode)
  {
    $entity = '';
    if ($tmp_str = $this->get_MIME_Version()) {
      $entity .= 'MIME-Version:' . $tmp_str . chr(13) . chr(10);
    }
   
    if ($tmp_str = $this->get_Content_Type()) {
      $entity .= 'Content-Type:' . $tmp_str;
    } else {
      trigger_error('Content-Type not found!' , E_USER_WARNING );
      return false;
    }

    if ('' === $this->Content_Type_parameter['boundary']) {
      trigger_error('boundary not found!' , E_USER_WARNING );
      return false;
    }
   
    if (is_array($this->Content_Type_parameter) && count($this->Content_Type_parameter) > 0) {
      foreach ($this->Content_Type_parameter as $key => $tmp_parameter)
      {
        $entity .= ';' . chr(13) . chr(10) ."\t$key=\"" . $tmp_parameter . "\"";
      }
    }
    $entity .= chr(13) . chr(10) . chr(13) . chr(10);
   
    if (empty($this->Sub_MIME_Entity)) {
      trigger_error('Sub_MIME_Entity not found!' , E_USER_WARNING );
      return false;
    }
   
    $tmp_entity = &$this->Sub_MIME_Entity;
    foreach ($tmp_entity as $key => $sub_entity)
    {
      $entity .= '--' . $this->Content_Type_parameter['boundary'] . chr(13) . chr(10);
      $entity .= $sub_entity->encode_Entity($charset, $encode) . chr(13) . chr(10). chr(13) . chr(10);
    }
   
    $entity .= '--' . $this->Content_Type_parameter['boundary'] . '--';
    return $entity;
  }
  
}

[/php]

[[i] 本帖最后由 angeloisme 于 2008-3-3 10:43 AM 编辑 [/i]]

angeloisme2008-3-3 02:31 AM
[color=Red]文件6/10 MIME_rfc822Message_Entity.Class.php[/color]
[php]
/**
* rfc822信件实体
* @author 满鸿
* @version 1.0
*/
class MIME_rfc822Message_Entity extends MIME_Single_Entity
{
  /**
   * 类构造函数
   */
  public function __construct()
  {
    $this->Body = '';
    MIME_Single_Entity::$Content_ID_no = 1;
  }
  
  /**
   * 设置实体MIME类型,只允许MIME::MESSAGE_RFC822
   *
   * @param string $type
   * @return boolean true 成功 || false 失败
   */
  public function set_Content_Type($type)
  {
    switch (strtolower($type))
    {
      case MIME::MESSAGE_RFC822 :
        $this->Content_Type = strtolower($type);
        break;
      default :
        trigger_error( htmlspecialchars($type) . ' is not be right content-type!' , E_USER_WARNING );
        return false;
    }
    return true;
  }

  /**
   * 设置实体编码方式,只允许MIME::EN7BIT,MIME::EN8BIT,MIME::ENBINARY
   *
   * @param string $encode
   * @return boolean true 成功 || false 失败
   */
  public function set_Content_Transfer_Encoding($encode)
  {
    switch (strtolower($encode))
    {
      case MIME::EN7BIT :
      case MIME::EN8BIT :
      case MIME::ENBINARY :
        $this->Content_Transfer_Encoding = strtolower($encode);
        break;
      default :
        trigger_error( htmlspecialchars($encode) . ' is not be right content-transfer-encoding!' , E_USER_WARNING );
        return false;
    }
    return true;
  }
  
  /**
   * 设置实体内容,必须是信件实体
   *
   * @param MIME_rfc822Header_Entity $body
   */
  public function set_Body(MIME_rfc822Header_Entity $body)
  {
    $this->Body = $body;
  }

  /**
   * 取得实体内容
   *
   * @return mixed MIME_rfc822Header_Entity || false 失败
   */
  public function get_Body()
  {
    if (is_a($this->Body, 'MIME_rfc822Header_Entity')) {
      return $this->Body;
    } else {
      return false;
    }
  }
  
  /**
   * 编码实体
   *
   * @param 字符集 $charset
   * @param 编码方法 $encode
   * @return mixed string || false 失败
   */
  public function encode_Entity($charset, $encode)
  {
    $entity = '';
    if ($tmp_str = $this->get_MIME_Version()) {
      $entity .= 'MIME-Version:' . $tmp_str . chr(13) . chr(10);
    }

    if ($tmp_str = $this->get_Content_Type()) {
      $entity .= 'Content-Type:' . $tmp_str;
    } else {
      trigger_error('Content-Type not found!' , E_USER_WARNING );
      return false;
    }

    if (is_array($this->Content_Type_parameter) && count($this->Content_Type_parameter) > 0) {
      foreach ($this->Content_Type_parameter as $key => $tmp_parameter)
      {
        switch ($key)
        {
          case 'name' :
            $tmp_str = MIME::rfc2047_encode($tmp_parameter, $charset, $encode, 5);
            break;
          default :
            $tmp_str = $tmp_parameter;
            break;
        }
        $entity .= ';' . chr(13) . chr(10) ."\t$key=\"" . $tmp_str . "\"";
      }
    }
    $entity .= chr(13) . chr(10);

    if ($tmp_str = $this->get_Content_Transfer_Encoding()) {
      $entity .= 'Content-Transfer-Encoding:' . $tmp_str . chr(13) . chr(10);
    }
   
    if ($tmp_str = $this->get_Content_Disposition()) {
      $entity .= 'Content-Disposition:' . $tmp_str;   
      if (is_array($this->Content_Disposition_parameter) && count($this->Content_Disposition_parameter) > 0) {
        foreach ($this->Content_Disposition_parameter as $key => $tmp_parameter)
        {
          switch ($key)
          {
            case 'filename' :
              $tmp_str = MIME::rfc2047_encode($tmp_parameter, $charset, $encode, 9);
              break;
            default :
              $tmp_str = $tmp_parameter;
              break;
          }
          $entity .= ';' . chr(13) . chr(10) . "\t$key=\"" . $tmp_str . "\"";
        }
      }
      $entity .= chr(13) . chr(10);
    }
   
    if ($tmp_str = $this->get_Content_ID()) {
      $entity .= 'Content-ID:<' . $tmp_str . '>' . chr(13) . chr(10);
    }
   
    if ($tmp_str = $this->get_Content_Description()) {
      $entity .= 'Content-Description:"' . MIME::rfc2047_encode($tmp_str, $charset, $encode, 21) . '"' . chr(13) . chr(10);
    }
   
    if ('' === $this->Body) {
      trigger_error('Body not found!' , E_USER_WARNING );
      return false;
    }

    $tmp_str = $this->Body->encode_Entity($charset, $encode);

    $entity.= chr(13) . chr(10) . $tmp_str;
    return $entity;
  }

}

[/php]

angeloisme2008-3-3 02:32 AM
[color=Red]文件7/10 MIME_ParitalHeader_Entity.Class.php[/color]
[php]
/**
* 分割后邮件的头实体
* @author 满鸿
* @version 1.0
*/
class MIME_ParitalHeader_Entity extends MIME_rfc822Header_Entity
{
  /**
   * 分割邮件实体的数组
   *
   * @var array
   */
  protected $Parital_Entity;
  
  /**
   * 类构造函数
   *
   * @param MIME_rfc822Header_Entity $head
   */
  public function __construct(MIME_rfc822Header_Entity $head = null)
  {
    $this->Parital_Entity = array();

    if (null !== $head) {
      $propertiy = get_object_vars($head);
      foreach ($propertiy as $key => $value)
      {
        if ($key == 'Message_ID' || $key == 'Body') {
          continue;
        }
        $this->$key = $value;
      }
    }
  }
  
  /**
   * 增加分割实体
   *
   * @param MIME_PartialMessage_Entity $entity
   */
  public function Add_Parital_Entity(MIME_PartialMessage_Entity $entity)
  {
    $this->Parital_Entity[] = $entity;
  }
  
  /**
   * 取得信件分割实体的数组
   *
   * @return mixed array || false 失败
   */
  public function get_Parital_Entity()
  {
    if (empty($this->Parital_Entity)) {
      return false;
    } else {
      return $this->Parital_Entity;
    }
  }
  
  /**
   * 编码分割实体,返回分割后的信件数组
   *
   * @param string $charset 字符集
   * @param string $encode 编码方法
   * @return mixed array || false 失败
   */
  public function encode_Entity($charset, $encode)
  {
    $sub_mail = array();
   
    $entity = '';
    if ($tmp_str = $this->get_Resent_Date()) {
      $entity .= 'Resent-Date:' . $tmp_str . chr(13) . chr(10);
    }

    if ($tmp_array = $this->get_Resent_From()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Resent-From:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Resent_Sender()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Resent-Sender:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Resent_Reply_To()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Resent-Reply-To:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Resent_To()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Resent-To:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Resent_Cc()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Resent-Cc:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Resent_Bcc()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Resent-Bcc:', $charset, $encode);
    }
   
    if ($tmp_str = $this->get_Resent_Message_ID()) {
      $entity .= 'Resent-Message-ID:' . $tmp_str . chr(13) . chr(10);
    }
   
    if ($tmp_str = $this->get_Date()) {
      $entity .= 'Date:' . $tmp_str . chr(13) . chr(10);
    }
   
    if ($tmp_array = $this->get_From()) {
      $entity .= $this->_encode_header_address($tmp_array, 'From:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Sender()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Sender:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Reply_To()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Reply-To:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_To()) {
      $entity .= $this->_encode_header_address($tmp_array, 'To:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Cc()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Cc:', $charset, $encode);
    }
   
    if ($tmp_array = $this->get_Bcc()) {
      $entity .= $this->_encode_header_address($tmp_array, 'Bcc:', $charset, $encode);
    }

    if ($tmp_str = $this->get_Comments()) {
      $entity .= 'Comments:' . MIME::rfc2047_encode($tmp_str, $charset, $encode, 9) . chr(13) . chr(10);
    }

    if ($tmp_array = $this->get_Keywords()) {
      $tmp_str = '';
      foreach ($tmp_array as $tmp)
      {
        $tmp_str .= ($tmp_str === '' ? '' : ',' . chr(13) . chr(10) . "\t")
                 .  MIME::rfc2047_encode($tmp, $charset, $encode, ($tmp_str === '' ? 10 : 0));
      }
      $entity .= 'Keywords:' . $tmp_str . chr