喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

[北京]代朋友公司招聘PHP高级程序员多名

上一主题 下一主题
 16  1/2  1  2  > 
     
标题: 共享自己MIME邮件编码解码包,写的不好,就当是抛砖引玉了  
 
angeloisme
新手上路
Rank: 1



UID 75214
精华 0
积分 4
帖子 33
金钱 3 喜悦币
威望 0
人脉 1
阅读权限 10
注册 2006-6-19
状态 离线
共享自己MIME邮件编码解码包,写的不好,就当是抛砖引玉了

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

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

文件 1/10 MIME.Class.php

<?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 76) || ($line_size === 76 && $key $all_size 1)) {
          
$str .= "=rn=" bin2hex($tmp);
          
$line_size 3;
        } else {
          
$str .= '=' bin2hex($tmp);
          
$line_size += 3;
        }
      } else {
        if ((
$line_size 76) || ($line_size === 76 && $key $all_size 1)) {
          
$str .= "=rn" $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($str0strlen($str) / 2), $charset$encode$header_len);
          
$after MIME::rfc2047_encode(substr($strstrlen($str) / 2), $charset$encode);
          return 
$befor "rnt" $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($str0strlen($str) / 2), $charset$encode$header_len);
          
$after MIME::rfc2047_encode(substr($strstrlen($str) / 2), $charset$encode);
          return 
$befor "rnt" $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) <= || 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);
  }

}
?>


 附件: 您所在的用户组无法下载或查看附件



今年的目标:在全年70%的时间里做到办事靠谱,说话着调
2008-3-3 10:26 AM#1
查看资料  发短消息  顶部
 
angeloisme
新手上路
Rank: 1



UID 75214
精华 0
积分 4
帖子 33
金钱 3 喜悦币
威望 0
人脉 1
阅读权限 10
注册 2006-6-19
状态 离线
[推荐阅读] OO
文件2/10 MIME_Entity.Class.php

<?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_errorhtmlspecialchars($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_errorhtmlspecialchars($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;
    }
  }

}
?>




今年的目标:在全年70%的时间里做到办事靠谱,说话着调
2008-3-3 10:26 AM#2
查看资料  发短消息  顶部
 
angeloisme
新手上路
Rank: 1



UID 75214
精华 0
积分 4
帖子 33
金钱 3 喜悦币
威望 0
人脉 1
阅读权限 10
注册 2006-6-19
状态 离线
[推荐阅读] 最近写的一个POS软件,发在CU上了。
文件3/10 MIME_rfc822Header_Entity.Class.php

<?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(