魏长东

weichangdong

php抓取邮件

php居然可以抓取邮件。好强大的说。

我实现的功能是,通过抓取邮件,然后提取出需要的数据。

//以腾讯邮箱做了测试
$mailServer="imap.qq.com"; //IMAP主机
$mailLink="{{$mailServer}:143}INBOX" ; //imagp连接地址:不同主机地址不同
$mailUser = '***'; //邮箱用户名
$mailPass = '***'; //邮箱密码
$mbox = imap_open($mailLink,$mailUser,$mailPass); //开启信箱imap_open
$totalrows = imap_num_msg($mbox); //取得信件数
for ($i=1;$i<$totalrows;$i++){
	$headers = imap_fetchheader($mbox, $i); //获取信件标头
	$headArr = matchMailHead($headers); //匹配信件标头
	$mailBody = imap_fetchbody($mbox, $i, 1); //获取信件正文
}

/**
*
* 匹配提取信件头部信息
* @param String $str
*/
function matchMailHead($str){
	$headList = array();
	$headArr = array(
		'from',
		'to',
		'date',
		'subject'
	);

	foreach ($headArr as $key){
		if(preg_match('/'.$key.':(.*?)[\n\r]/is', $str,$m)){
			$match = trim($m[1]);
			$headList[$key] = $key=='date'?date('Y-m-d H:i:s',strtotime($match)):$match;
		}
	}
	return $headList;
}



imap_append:  附加字符串到指定的邮箱中。
imap_base64:  解 BASE64 编码。
imap_body:  读信的内文。
imap_check:  返回邮箱信息。
imap_close:  关闭 IMAP 链接。
imap_createmailbox:  建立新的信箱。
imap_delete:  标记欲删除邮件。
imap_deletemailbox:  删除既有信箱。
imap_expunge:  删除已标记的邮件。
imap_fetchbody:  从信件内文取出指定部分。
imap_fetchstructure:  获取某信件的结构信息。
imap_header:  获取某信件的标头信息。
imap_headers:  获取全部信件的标头信息。
imap_listmailbox:  获取邮箱列示。
imap_listsubscribed:  获取订阅邮箱列示。
imap_mail_copy:  复制指定信件到它处邮箱。
imap_mail_move:  移动指定信件到它处邮箱。
imap_num_msg:  取得信件数。
imap_num_recent:  取得新进信件数。
imap_open:  打开 IMAP 链接。
imap_ping:  检查 IMAP 是否连接。
imap_renamemailbox:  更改邮箱名字。
imap_reopen:  重开 IMAP 链接。
imap_subscribe:  订阅邮箱。
imap_undelete:  取消删除邮件标记。
imap_unsubscribe:  取消订阅邮箱。
imap_qprint:  将 qp 编码转成八位。
imap_8bit:  将八位转成 qp 编码。
imap_binary:  将八位转成 base64 编码。
imap_scanmailbox:  寻找信件有无特定字符串。
imap_mailboxmsginfo:  取得目前邮箱的信息。
imap_rfc822_write_address:  电子邮件位址标准化。
imap_rfc822_parse_adrlist:  解析电子邮件位址。
imap_setflag_full:  配置信件标志。
imap_clearflag_full:  清除信件标志。
imap_sort:  将信件标头排序。
imap_fetchheader:  取得原始标头。
imap_uid:  取得信件 UID。
imap_getmailboxes:  取得全部信件详细信息。
imap_getsubscribed:  列出所有订阅邮箱。
imap_msgno:  列出 UID 的连续信件。
imap_search:  搜寻指定标准的信件。
imap_last_error:  最后的错误信息。
imap_errors:  所有的错误信息。
imap_alerts:  所有的警告信息。
imap_status:  目前的状态信息。


class receiveMail
{
    ...
    function receiveMail($username,$password,$EmailAddress,$mailserver='localhost',
$servertype='pop',$port='110',$ssl = false) //Constructure
 
    function getHeaders($mid) // Get Header info
 
    function getTotalMails() //Get Total Number off Unread Email In Mailbox
 
    function getUnreadMails() //Get Number of Unread Mail from Mailbox
 
    function searchUnreadMails() //Find Numbers of Unread Mail by imap_search Method
 
    function GetAttach($mid,$path) // Get Atteced File from Mail
 
    function getBody($mid) // Get Message Body
 
    function deleteMails($mid) // Delete That Mail
 
    function close_mailbox() //Close Mail Box
	
	
	
	function getHeaders($mid) // Get Header info
{
    if(!$this->marubox)
        return false;
 
    $mail_header=imap_header($this->marubox,$mid);
    $sender=$mail_header->from[0];
    $sender_replyto=$mail_header->reply_to[0];
 
 
    if(strtolower($sender->mailbox)!='mailer-daemon' && strtolower($sender->mailbox)!='postmaster')
    {
        $mail_details=array(
                'from'=>strtolower($sender->mailbox).'@'.$sender->host,
                'fromName'=>$sender->personal,
                'subject'=>$mail_header->subject,
                'to'=>$mail_header->toaddress
            );
    }
    return $mail_details;
}

function get_part($stream, $msg_number, $mime_type, $structure = false, $part_number = false) 
//Get Part Of Message Internal Private Use
{ 
    if(!$structure) { 
        $structure = imap_fetchstructure($stream, $msg_number); 
    } 
    if($structure) { 
        if($mime_type == $this->get_mime_type($structure))
        { 
            if(!$part_number) 
            { 
                $part_number = "1"; 
            } 
            $text = imap_fetchbody($stream, $msg_number, $part_number); 
            if($structure->encoding == 3) 
            { 
                return iconv('gb2312','utf8',imap_base64($text)); 
            } 
            else if($structure->encoding == 4) 
            { 
                return iconv('gb2312','utf8',imap_qprint($text)); 
            } 
            else
            { 
                return iconv('gb2312','utf8',$text); 
            } 
        } 
        if($structure->type == 1) /* multipart */
        { 
            while(list($index, $sub_structure) = each($structure->parts))
            { 
                if($part_number)
                { 
                    $prefix = $part_number . '.'; 
                } 
                $data = $this->get_part($stream, $msg_number, $mime_type, $sub_structure, $prefix . ($index + 1)); 
                if($data)
                { 
                    return $data; 
                } 
            } 
        } 
    } 
    return false; 
}