学习注水-20161113-php-imap收取邮件知识点mark一下「待解一个已知的bug」
来源:互联网 发布:淘宝小号无忧 编辑:程序博客网 时间:2024/05/22 06:51
PHP使用IMAP收取邮件
- 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_open: 打开 IMAP 链接。
- imap_ping: 检查 IMAP 是否连接。
- imap_renamemailbox: 更改邮箱名字。
- imap_reopen: 重开 IMAP 链接。
- imap_undelete: 取消删除邮件标记。
- imap_8bit: 将八位转成 qp 编码。
- 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: 目前的状态信息。
IMAP 电子邮件系统函数库
PHP收邮件receiveMail
- 必须开启imap扩展模块的支持
- 此方法支持中文,不会乱码
第二个答案不错!
php imap收邮件乱码
我就想说,我管那么多做什么–,我就是想知道sent文件夹是哪一个罢了嘛。。
IMAP协议学习
有一个已知的bug,暂时不想解:对于纯文本的邮件无法正常解析,解决方法很简单,就是根据structure的type字段识别并对应if-else就可以了。
参考如下:
http://php.net/manual/en/function.imap-fetchbody.php
With an email message that only has a text body and does not have any mime attachments, imap-fetchbody() will return the following for each requested part number: (empty) - Entire message 0 - Message header 1 - Body textWith an email message that is a multi-part message in MIME format, and contains the message text in plain text and HTML, and has a file.ext attachment, imap-fetchbody() will return something like the following for each requested part number: (empty) - Entire message 0 - Message header 1 - MULTIPART/ALTERNATIVE 1.1 - TEXT/PLAIN 1.2 - TEXT/HTML 2 - file.extNow if you attach the above email to an email with the message text in plain text and HTML, imap_fetchbody() will use this type of part number system: (empty) - Entire message 0 - Message header 1 - MULTIPART/ALTERNATIVE 1.1 - TEXT/PLAIN 1.2 - TEXT/HTML 2 - MESSAGE/RFC822 (entire attached message) 2.0 - Attached message header 2.1 - TEXT/PLAIN 2.2 - TEXT/HTML 2.3 - file.ext
下附代码:
<?php define('DEBUG', true); header("Content-Type:text/html; charset=utf-8"); //sent - 发件箱 // $host = '{imap.163.com:993/ssl}INBOX';//&XfJT0ZAB- // $user = "xxx@163.com"; // $password = "xxx"; $host = '{imap.mxhichina.com:993/ssl}';//&XfJT0ZAB- $user = "xxx"; $password = "xxx"; // 定位到具体某一个文件夹 // &XfJT0ZAB - sent // $mailboxes = imap_list($mbox, $host, '*'); // $mailboxes = str_replace($host, '', $mailboxes); // var_dump($mailboxes); // $list = imap_mailboxmsginfo($mbox); // var_dump($list); $sent = "&XfJT0ZAB-"; // 登陆连接 ssl imap $mbox = imap_open ($host, $user, $password, OP_HALFOPEN) or die("can't connect: " . imap_last_error()); // 打开 sent - 发送箱文件夹 imap_reopen($mbox, $host.$sent); $emails = imap_search($mbox,'ALL'); var_dump($emails); $email_total_array = array(); if($emails) { $output = ''; rsort($emails); //遍历所有邮件 foreach($emails as $email_number) { // 控制循环次数 // $ri++; // if($ri>6){ // break; // } //得到structure $email_array = array(); // http://www.kuqin.com/php5_doc/function.imap-fetchstructure.html // type Primary body type // 0: text // 1: multipart // 2: message // 3: application // 4: audio // 5: image // 6: video // 7: other //header("Content-typee: ".$type); //header("Content-Disposition: attachment; filename=".$name); // encoding Body transfer encoding // ifsubtype TRUE if there is a subtype string // subtype MIME subtype // ifdescription TRUE if there is a description string // description Content description string // ifid TRUE if there is an identification string // id Identification string // lines Number of lines // bytes Number of bytes // ifdisposition TRUE if there is a disposition string // disposition Disposition string // ifdparameters TRUE if the dparameters array exists // dparameters An array of objects where each object has an "attribute" and a "value" property corresponding to the parameters on the Content-disposition MIMEheader. // ifparameters TRUE if the parameters array exists // parameters An array of objects where each object has an "attribute" and a "value" property. // parts An array of objects identical in structure to the top-level object, each of which corresponds to a MIME body part. $structure = imap_fetchstructure($mbox, $email_number); $message = ""; $tt = 0; // 已知为 html/message //得到message if(isset($structure->parts) && is_array($structure->parts) && isset($structure->parts[1])) { $part = $structure->parts[1]; // http://www.kuqin.com/php5_doc/function.imap-fetchbody.html // 0 - Message header // 1 - MULTIPART/ALTERNATIVE // 1.1 - TEXT/PLAIN // 1.2 - TEXT/HTML // 2 - MESSAGE/RFC822 (entire attached message) // 2.0 - Attached message header // 2.1 - TEXT/PLAIN // 2.2 - TEXT/HTML // 2.3 - file.ext // http://php.net/manual/en/function.imap-fetchbody.php // With an email message that only has a text body and does not have any mime attachments, imap-fetchbody() will return the following for each requested part number: // (empty) - Entire message // 0 - Message header // 1 - Body text // With an email message that is a multi-part message in MIME format, and contains the message text in plain text and HTML, and has a file.ext attachment, imap-fetchbody() will return something like the following for each requested part number: // (empty) - Entire message // 0 - Message header // 1 - MULTIPART/ALTERNATIVE // 1.1 - TEXT/PLAIN // 1.2 - TEXT/HTML // 2 - file.ext // Now if you attach the above email to an email with the message text in plain text and HTML, imap_fetchbody() will use this type of part number system: // (empty) - Entire message // 0 - Message header // 1 - MULTIPART/ALTERNATIVE // 1.1 - TEXT/PLAIN // 1.2 - TEXT/HTML // 2 - MESSAGE/RFC822 (entire attached message) // 2.0 - Attached message header // 2.1 - TEXT/PLAIN // 2.2 - TEXT/HTML // 2.3 - file.ext $message = imap_fetchbody($mbox, $email_number, 1.2); if($message == ""){ $message = imap_fetchbody($mbox, $email_number, 2); }else{ $tt = 1; // 不是 html/message } $coding = $part->encoding; if($tt == 0){ // 已知为 html/message // http://www.kuqin.com/php5_doc/function.imap-fetchstructure.html // 0 7BIT // 1 8BIT // 2 BINARY // 3 BASE64 // 4 QUOTED-PRINTABLE // 5 OTHER if ($coding == 0) { $message = $message; } elseif ($coding == 1) { $message = $message; } elseif ($coding == 2) { $message = $message; } elseif ($coding == 3) { $message = imap_base64($message); } elseif ($coding == 4) { $message = imap_qprint($message); } elseif ($coding == 5) { $message = $message; } } //echo "<br>^^<br>".$message."<br/>$$<br>"; //echo "<img src=".$message.">"; } //得到邮件的标头部分:是否已读,发件人,日期,标题。 // http://www.kuqin.com/php5_doc/function.imap-headerinfo.html // to[] // personal // adl // mailbox // host // from[] // personal // adl // mailbox // host // cc[] // personal // adl // mailbox // host // bcc[] // personal // adl // mailbox // host // reply_to[] // personal // adl // mailbox // host // sender[] // personal // adl // mailbox // host // return_path[] // personal // adl // mailbox // host // udate (mail message date in unix time) // fetchfrom (from line formatted to fit fromlength characters) // fetchsubject (subject line formatted to fit subjectlength characters) $header = imap_headerinfo($mbox, $email_number); $fromaddr = $header->from[0]->mailbox . "@" . $header->from[0]->host; echo $fromaddr."##<br>"; // http://www.baike.com/wiki/imap_fetch_overview // subject - the messages subject // from - who sent it // to - recipient // date - when was it sent // message_id - Message-ID // references - is a reference to this message id // in_reply_to - is a reply to this message id // size - size in bytes // uid - UID the message has in the mailbox // msgno - message sequence number in the mailbox // recent - this message is flagged as recent // flagged - this message is flagged // answered - this message is flagged as answered // deleted - this message is flagged for deletion // seen - this message is flagged as already read // draft - this message is flagged as being a draft $overview = imap_fetch_overview($mbox, $email_number, 0); // http://www.php100.com/cover/php/1034.html // imap_utf8 — Converts MIME-encoded text to UTF-8 $sender = imap_utf8($overview[0]->from); $seen = $overview[0]->seen ? 'read' : 'unread'; $date = $overview[0]->date; $subject = imap_utf8($overview[0]->subject); $SendEmailAddress = $fromaddr; echo $sender."**<br/>"; //得到message的字符编码。 if($tt == 0){ // 已知为 html/message // http://www.jb51.net/article/27282.htm // 使用 mb_detect_encoding 函数进行编码识别 $encodedd = mb_detect_encoding($message, array('UTF-8','US-ASCII','GB2312', 'ISO-8859-1','ISO-8859-2','ISO-8859-4','ISO-8859-5','ISO-8859-6','ISO-8859-7','ISO-8859-8','ISO-8859-9','ISO-8859-10','ISO-2022-JP','ISO-2022-KR')); //进行转码 // http://www.jb51.net/article/14530.htm // iconv函数库能够完成各种字符集间的转换 if($encodedd == "EUC-CN"){ $message= iconv("GB2312", "UTF-8", $message); }else if($encodedd == "ISO-8859-1"){ $message= iconv("ISO-8859-1", "UTF-8", $message); }else if($encodedd == "ISO-8859-2"){ $message= iconv("ISO-8859-2", "UTF-8", $message); }else if($encodedd == "ISO-8859-4"){ $message= iconv("ISO-8859-4", "UTF-8", $message); }else if($encodedd == "ISO-8859-5"){ $message= iconv("ISO-8859-5", "UTF-8", $message); }else if($encodedd == "ISO-8859-6"){ $message= iconv("ISO-8859-6", "UTF-8", $message); }else if($encodedd == "ISO-8859-7"){ $message= iconv("ISO-8859-7", "UTF-8", $message); }else if($encodedd == "ISO-8859-8"){ $message= iconv("ISO-8859-8", "UTF-8", $message); }else if($encodedd == "ISO-8859-9"){ $message= iconv("ISO-8859-9", "UTF-8", $message); }else if($encodedd == "ISO-8859-10"){ $message= iconv("ISO-8859-10", "UTF-8", $message); }else if($encodedd == "ISO-2022-JP"){ $message= iconv("ISO-2022-JP", "UTF-8", $message); }else if($encodedd == "ISO-2022-KR"){ $message= iconv("ISO-2022-KR", "UTF-8", $message); }else{ $message= $message; } // 让我们一起来解一个编码的 bug !!! 并且 mark 一个转多种编码的在线平台网址:http://bianma.911cha.com/ if($message == base64_encode(base64_decode($message))){//base64........日 $message = base64_decode($message); } } else{ // 不是 html/message $message= $message; } //邮箱信息保存到数组 //加载附件//////////// // $attachments = array(); /* if any attachments found... */ // 这段我不关心 ==。。 // if(isset($structure->parts) && count($structure->parts)) { // for($i = 0; $i < count($structure->parts); $i++) { // $attachments[$i] = array( // 'is_attachment' => false, // 'filename' => '', // 'name' => '', // 'attachment' => '' // ); // if($structure->parts[$i]->ifdparameters) { // foreach($structure->parts[$i]->dparameters as $object) { // if(strtolower($object->attribute) == 'filename') { // $attachments[$i]['is_attachment'] = true; // $attachments[$i]['filename'] = imap_utf8($object->value); // } // } // } // if($structure->parts[$i]->ifparameters) { // foreach($structure->parts[$i]->parameters as $object) // { // if(strtolower($object->attribute) == 'name') // { // $attachments[$i]['is_attachment'] = true; // $attachments[$i]['name'] = imap_utf8($object->value); // } // } // } // if($attachments[$i]['is_attachment']) { // $attachments[$i]['attachment'] = imap_fetchbody($mbox, $email_number, $i+1); // /* 4 = QUOTED-PRINTABLE encoding */ // if($structure->parts[$i]->encoding == 3) { // $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']); // } // /* 3 = BASE64 encoding */ // elseif($structure->parts[$i]->encoding == 4) { // $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']); // } // } // } // } /* iterate through each attachment and save it */ // $atta_array = array(); // foreach($attachments as $attachment) { // if($attachment['is_attachment'] == 1) { // $filename = $attachment['name']; // if(empty($filename)) // $filename = $attachment['filename'] . "_" . time() . ".dat"; // /* prefix the email number to the filename in case two emails // * have the attachment with the same file name. // */ // $l_filename = $filename; // $file_hz = strrev(substr(strrev($filename),0,4)); // $datatimes = date('Y-m-d-G-i-s', time()); // //$datatimes = str_replace(" ","-",$datatimes); // $datatimes = $email_number."-".$datatimes; // $filename = $datatimes.$file_hz; // $file_dir = "file/".$filename; // $atta_array[] = array("filename"=>$filename,"filealiases"=>$l_filename,"filedir"=>$file_dir); // //win 7下面的文件编码都是gb2312,所以需要转换编码。 // // $filename = iconv("UTF-8", "GB2312",$filename); // //echo $l_filename; // $fp = fopen("./".$file_dir, "w+"); // fwrite($fp, $attachment['attachment']); // fclose($fp); // } // } //var_dump($atta_array); ////////加载附件代码结束。 $email_total_array[] = array("attament"=>$atta_array ,"email_number"=>$email_number,"seen"=>$seen,"date"=>$date,"sender"=>$sender,"subject"=>$subject,"message"=>$message,"SendEmailAddress"=>$SendEmailAddress); //$email_total_array['attament'] = $atta_array; } //把信息写入到数据库中 // 这段我也不关心--看上去是 APP 的东西,原作者真是==大神 // $app = Mage::app(); // foreach($email_total_array as $ea){ // $n_sender = $ea['sender']; // if(strstr($n_sender," <")){ // $e_sender = substr($n_sender,0,strpos($n_sender," <")); // }else{ // $e_sender = $n_sender; // } // $email_list = Mage::getModel("email/list"); // $email_list->setEmailMessageNo($ea['email_number']); // $email_list->setSendEmailAddress($ea['SendEmailAddress']); // $email_list->setEmailSender($e_sender); // $email_list->setReceiveEmailAddress($user); // $email_list->setEmailSendTime($ea['date']); // $email_list->setEmailTitle($ea['subject']); // $email_list->setEmailContent($ea['message']); // $email_list->setOrderNo(); // $email_list->setCustomerService(); // $email_list->setOrderStyle(); // $email_list->setLanguage(); // $email_list->setOrderTotal(); // $email_list->setCaseStatus(); // $email_list->save(); // $email_id = $email_list->getId();// // $attament = $ea['attament']; // foreach($attament as $aa){ // $filename = $aa['filename'];// // $filealiases = $aa['filealiases'];// // $filedir = $aa['filedir'];// // //保存 // $email_attachment = Mage::getModel("email/attachment"); // $email_attachment->setEmailId($email_id); // $email_attachment->setAttachmentName($filename); // $email_attachment->setAttachmentAliases($filealiases); // $email_attachment->setAttachmentDir($filedir); // $email_attachment->save(); // } // } } imap_close($mbox);?>
参考:
「重要,提供了重要思路!」
- PHP利用imap收件箱的例子
- php imap gmail接收邮件。
0 0
- 学习注水-20161113-php-imap收取邮件知识点mark一下「待解一个已知的bug」
- php imap 收取邮件及其附件
- 收取邮件的协议 : pop3 exchange imap
- 使用具备IMAP邮件收取功能的邮件服务器专题
- 使用IMAP收取Gmail邮件
- python 专题九 POP IMAP 邮件收取
- javamail使用IMAP协议收取gmail邮件
- 用PHP实现POP3邮件的收取
- php 收取邮件
- Mark一下 PopupWindow 的系统BUG
- 一个学习cocosd-x的博客,mark一下
- 用PHP实现POP3邮件的收取(转载)
- 人生的一个小转折点,mark一下
- 用PHP读取IMAP邮件
- php imap gmail接收邮件。
- php imap读取邮件功能
- 收取邮件的工具类
- gmail邮件的pop收取
- Windows SSH虚拟机linux开发环境
- 使用QML编写舒尔特表小程序
- 数学概念的提出与演化
- log4j2.x官方文档翻译(二)
- Pid文件和路径
- 学习注水-20161113-php-imap收取邮件知识点mark一下「待解一个已知的bug」
- OJ_320.鸡兔同笼
- 静态方法
- library-ssh: action 和 dao
- 使用最新的struts2 2.5.5导致404的问题解决方法
- day11.14
- 串操作指令
- OJ_1168.喝可乐
- Html Css 基础小结