企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] ## 常用函数 函数 ``` imap_open // 连接函数 imap_num_msg // 获取当前邮箱中的邮件数量 imap_num_recent //获取当前邮箱中的新邮件数量 imap_check // 返回当前邮箱信息 imap_setflag_full // 设置邮箱标记 imap_clearflag_full //清楚标记 imap_delete //删除邮箱 imap_undelete // 取消标记未删除的邮箱 imap_expunge //删除标记删除的所有消息 imap_headerinfo // 获取单个邮箱元数据 imap_fetchheader //获取单个或多个头信息 imap_fetch_overview // 阅读给定消息的标题中的信息概述 imap_fetchbody // 获取邮箱正文,第三个参数为1,表示获取正文,与 imap_body 相似 imap_body // 通过邮箱索引获取邮箱body imap_mime_header_decode // 解析元数据 imap_msgno // 通过uid 获取消息序列 imap_uid //给定消息序列号的UID imap_search // 搜索邮箱 ``` 常量 ``` // FLAGS define('SE_NOPREFETCH', 4); define('SO_FREE', 8); define('SO_NOSERVER', 8); define('SA_MESSAGES', 1); define('SA_RECENT', 2); define('SA_UNSEEN', 4); define('SA_UIDNEXT', 8); define('SA_UIDVALIDITY', 16); define('SA_ALL', 31); ``` ## 注意事项 很多函数带 有 flag 可以把 msggno 的参数设置为 uid ``` imap_fetch_overview($inbox,10585,FT_UID) ``` ## 示例 ### imap_status 邮箱状态 ``` $status = imap_status($inbox, $hostname, SA_ALL); //object(stdClass)#2 (6) { // ["flags"]=> // int(31) // ["messages"]=> // int(9599) // ["recent"]=> // int(0) // ["unseen"]=> // int(4) // ["uidnext"]=> // int(10585) // ["uidvalidity"]=> // int(1357024812) //} ``` - uidnext 获取下一封右键的 唯一值 uid - messages 获取总数 - recent 新邮箱 - unseen 未读邮箱 - uidvalidity 邮箱的 UID 有效性 - flags 为邮箱的标记 ``` define('SE_NOPREFETCH', 4); define('SO_FREE', 8); define('SO_NOSERVER', 8); define('SA_MESSAGES', 1); define('SA_RECENT', 2); define('SA_UNSEEN', 4); define('SA_UIDNEXT', 8); define('SA_UIDVALIDITY', 16); define('SA_ALL', 31); ``` ### imap_append `imap_append` 函数并不能直接用来发送电子邮件,但可以用于将电子邮件添加到指定邮箱的“已发送”文件夹。为了实现发送电子邮件并记录在 IMAP 服务器上的“已发送”文件夹,可以先使用 SMTP 协议发送电子邮件,然后使用 `imap_append` 将该邮件保存到“已发送”文件夹 ``` // IMAP 服务器配置 $hostname = '{imap.qq.com:993/ssl}INBOX'; $username = '26xxxx304@qq.com'; $password = 'gzrxxxibb'; // 打开 IMAP 连接 $inbox = imap_open($hostname, $username, $password,OP_READONLY) or die('Cannot connect to mail server: ' . imap_last_error()); // 构造邮件 $message = "From: sender@qq.com\r\n"; $message .= "To: 26xxx3304@qq.com\r\n"; $message .= "Subject: Test message\r\n"; $message .= "\r\n"; $message .= "This is a test message.\r\n"; // 追加邮件到邮箱 if (imap_append($inbox, $hostname, $message)) { echo "Message appended successfully."; } else { echo "Failed to append message: " . imap_last_error(); } ``` ### imap_body / imap_fetchbody 获取邮箱内容 imap_body ``` // 打开 IMAP 连接 $inbox = imap_open($hostname, $username, $password,OP_READONLY) or die('Cannot connect to mail server: ' . imap_last_error()); $num = imap_num_msg($inbox); // 获取邮箱总数 // 获取第二新的邮箱 $imap_body = imap_body($inbox, $num-1); var_dump($imap_body); //"This is a test message. ``` imap_fetchbody ``` $msg_number = 1; $section = "1"; // 1 表示获取消息本体 $body = imap_fetchbody($imap_stream, $msg_number, $section); if ($body !== false) { echo "Email body:\n"; echo $body; } else { echo "Failed to fetch email body: " . imap_last_error(); } ``` ### imap_check ``` $stdClass = imap_check($inbox); var_dump($stdClass); object(stdClass)#2 (5) { ["Date"]=> string(30) "Tue, 2 Jul 2024 15:05:04 +0800" ["Driver"]=> string(4) "imap" ["Mailbox"]=> string(70) "{imap.qq.com:993/imap/notls/ssl/readonly/user="26xxx04@qq.com"}INBOX" ["Nmsgs"]=> int(9601) ["Recent"]=> int(0) } ``` ### imap_setflag_full/ imap_clearflag_full ``` 常见标志 \\Seen:邮件已读标志。 \\Answered:邮件已回复标志。 \\Flagged:邮件标记为重要标志。即收藏 \\Deleted:邮件标记为删除标志。 \\Draft:邮件标记为草稿标志。 ``` 示例 ``` // 指定邮件序号范围和标志 $sequence = '1:3'; // 清除第一到第三封邮件的标志,也可以设置一个 $flag = '\\Seen'; // \Seen 表示已读标志 if (imap_setflag_full($imap_stream, $sequence, $flag)) { echo "Flags set successfully."; } else { echo "Failed to set flags: " . imap_last_error(); } // 清除标志 if (imap_clearflag_full($imap_stream, $sequence, $flag)) { echo "Flags cleared successfully."; } else { echo "Failed to clear flags: " . imap_last_error(); } ``` ### imap_headerinfo / imap_fetchheader / imap_fetch_overview <details> <summary>imap_headerinfo 获取单个,返回一个对象,包含f丰富的字段信息</summary> ``` $imap_body = imap_headerinfo($inbox, $num); // 获取最新邮箱 var_dump($imap_body); //object(stdClass)#2 (23) { // ["date"]=> // string(36) "Tue, 2 Jul 2024 15:10:55 +0800 (CST)" // ["Date"]=> // string(36) "Tue, 2 Jul 2024 15:10:55 +0800 (CST)" // ["subject"]=> // string(36) "=?utf-8?B?5q+P5pel5L+h55So566h5a62?=" // ["Subject"]=> // string(36) "=?utf-8?B?5q+P5pel5L+h55So566h5a62?=" // ["message_id"]=> // string(82) "<714080548.31948858.1719904255037.JavaMail.cmbchina@mailm1ph.message.cmbchina.com>" // ["toaddress"]=> // string(43) "=?utf-8?B?MjYwMDgzMzA0?= <260083304@qq.com>" // ["to"]=> // array(1) { // [0]=> // object(stdClass)#3 (3) { // ["personal"]=> // string(24) "=?utf-8?B?MjYwMDgzMzA0?=" // ["mailbox"]=> // string(9) "260083304" // ["host"]=> // string(6) "qq.com" // } // } // ["fromaddress"]=> // string(69) "=?utf-8?B?5oub5ZWG6ZO26KGM5L+h55So5Y2h?= <ccsvc@message.cmbchina.com>" // ["from"]=> // array(1) { // [0]=> // object(stdClass)#4 (3) { // ["personal"]=> // string(40) "=?utf-8?B?5oub5ZWG6ZO26KGM5L+h55So5Y2h?=" // ["mailbox"]=> // string(5) "ccsvc" // ["host"]=> // string(20) "message.cmbchina.com" // } // } // ["reply_toaddress"]=> // string(69) "=?utf-8?B?5oub5ZWG6ZO26KGM5L+h55So5Y2h?= <ccsvc@message.cmbchina.com>" // ["reply_to"]=> // array(1) { // [0]=> // object(stdClass)#5 (3) { // ["personal"]=> // string(40) "=?utf-8?B?5oub5ZWG6ZO26KGM5L+h55So5Y2h?=" // ["mailbox"]=> // string(5) "ccsvc" // ["host"]=> // string(20) "message.cmbchina.com" // } // } // ["senderaddress"]=> // string(69) "=?utf-8?B?5oub5ZWG6ZO26KGM5L+h55So5Y2h?= <ccsvc@message.cmbchina.com>" // ["sender"]=> // array(1) { // [0]=> // object(stdClass)#6 (3) { // ["personal"]=> // string(40) "=?utf-8?B?5oub5ZWG6ZO26KGM5L+h55So5Y2h?=" // ["mailbox"]=> // string(5) "ccsvc" // ["host"]=> // string(20) "message.cmbchina.com" // } // } // ["Recent"]=> // string(1) " " // ["Unseen"]=> // string(1) "U" // ["Flagged"]=> // string(1) " " // ["Answered"]=> // string(1) " " // ["Deleted"]=> // string(1) " " // ["Draft"]=> // string(1) " " // ["Msgno"]=> // string(4) "9602" // ["MailDate"]=> // string(26) " 2-Jul-2024 15:10:55 +0800" // ["Size"]=> // string(5) "45441" // ["udate"]=> // int(1719904255) //} ``` </details> <details> <summary>imap_fetchheader 返回单个字符串的 key: value 信息 </summary> ``` $imap_fetchheader = imap_fetchheader($inbox, 1,); string(1106) "Received: from mail.easyrote.com (unknown [219.232.246.83]) by newmx20.qq.com (NewMx) with SMTP id for <260083304@qq.com>; Fri, 10 Oct 2014 09:34:00 +0800 X-QQ-SSF: 00500000000000601x900001020052x Received: from 127.0.0.1 (unknown [219.232.246.84]) by mail.easyrote.com (Postfix - by easyrote.com) with ESMTPA id E14633670647 for <260083304@qq.com>; Fri, 10 Oct 2014 09:33:56 +0800 (CST) Date: Fri, 10 Oct 2014 09:33:54 +0800 To: =?UTF-8?B?5pmD5pmD5oKg5oKgdGltZQ==?= <260083304@qq.com> From: =?UTF-8?B?5piT5ZGX572R?= <noreply@yibei.com> Subject: =?UTF-8?B?5qyi6L+O5Yqg5YWl5piT5ZGX572R44CC?= Message-ID: <398f3bc0ff6f963daf09475b9878474d@127.0.0.1> X-Priority: 3 X-Mailer: PHPMailer 5.0.0 (phpmailer.codeworxtech.com) MIME-Version: 1.0 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable " ``` </details> <details> <summary>imap_fetch_overview 可以获取多个邮箱的对象数组信息,适用于快速邮件列表获取</summary> ``` $imap_fetch_overview = imap_fetch_overview($inbox, $num-1); var_dump($imap_fetch_overview); //array(1) { // [0]=> // object(stdClass)#2 (13) { // ["subject"]=> // string(28) "=?utf-8?B?VGVzdCBtZXNzYWdl?=" // ["from"]=> // string(36) "=?utf-8?B?c2VuZGVy?= <sender@qq.com>" // ["to"]=> // string(43) "=?utf-8?B?MjYwMDgzMzA0?= <260083304@qq.com>" // ["size"]=> // int(135) // ["uid"]=> // int(10585) // ["msgno"]=> // int(9600) // ["recent"]=> // int(0) // ["flagged"]=> // int(0) // ["answered"]=> // int(0) // ["deleted"]=> // int(0) // ["seen"]=> // int(1) // ["draft"]=> // int(0) // ["udate"]=> // int(1719900791) // } //} ``` </details> ### imap_delete/imap_expunge 删除邮箱 ``` // 删除最新一封邮箱 $num = imap_num_msg($inbox); // 获取邮箱总数 imap_delete($inbox,$num); imap_expunge($inbox); ``` ### imap_search 参数说明 ``` ALL:匹配所有消息。 ANSWERED:匹配已标记为已回答的消息。 BCC "string":匹配在密件抄送(Bcc)字段中包含“string”的消息。 BEFORE "date":匹配日期在“date”之前的消息。 BODY "string":匹配邮件正文中包含“string”的消息。 CC "string":匹配在抄送(Cc)字段中包含“string”的消息。 DELETED:匹配已删除的消息。 FLAGGED:匹配标记为重要或紧急(\FLAGGED)的消息。 FROM "string":匹配发件人字段中包含“string”的消息。 KEYWORD "string":匹配包含关键词“string”的消息。 NEW:匹配新消息(未读消息,\RECENT标志和未设置\SEEN标志)。 OLD:匹配旧消息(已读消息或非最近的消息)。 ON "date":匹配日期为“date”的消息。 RECENT:匹配最近的消息(具有\RECENT标志)。 SEEN:匹配已读消息(设置了\SEEN标志)。 SINCE "date":匹配日期在“date”之后的消息。 SUBJECT "string":匹配主题中包含“string”的消息。 TEXT "string":匹配消息中任意部分包含“string”的消息。 TO "string":匹配收件人字段中包含“string”的消息。 UNANSWERED:匹配未标记为已回答的消息。 UNDELETED:匹配未删除的消息。 UNFLAGGED:匹配未标记为重要或紧急的消息。 UNKEYWORD "string":匹配不包含关键词“string”的消息。 UNSEEN:匹配未读消息(未设置\SEEN标志)。 ``` ### imap_mime_header_decode ``` $text = "=?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@example.com>"; $elements = imap_mime_header_decode($text); for ($i=0; $i<count($elements); $i++) { echo "Charset: {$elements[$i]->charset}\n"; echo "Text: {$elements[$i]->text}\n\n"; } ``` ### 批量获取头信息,并获取body ``` <?php // IMAP 服务器配置 $hostname = '{imap.qq.com:993/ssl}INBOX'; $username = '2600xxx304@qq.com'; $password = 'gxxxhinbibb'; // 打开 IMAP 连接 $inbox = imap_open($hostname, $username, $password,OP_READONLY) or die('Cannot connect to mail server: ' . imap_last_error()); $currentDate = new \DateTime(); $currentDate->modify("-1 days"); $opt = "SINCE {$currentDate->format('d-M-Y')}"; $arr = imap_search($inbox, $opt,SE_UID); // 返回uid 数组 [1,2,3,...] $emailHeads = imap_fetch_overview($inbox, implode(",",$arr), FT_UID); // 返回邮箱元数据 数组 foreach ($emailHeads as $emailHead){ // 解析头文件 $email['subject']=imap_mime_header_decode($emailHead->subject)[0]->text; $email['from']=imap_mime_header_decode($emailHead->from)[1]->text; $email['from_name']=imap_mime_header_decode($emailHead->from)[0]->text; $email['to']=imap_mime_header_decode($emailHead->to)[1]->text; $email['size']=$emailHead->size; $email['flagged']=$emailHead->flagged; $email['answered']=$emailHead->answered; $email['unread']=$emailHead->seen; $email['deleted']=$emailHead->deleted; $email['udate']=(int)$emailHead->udate; $email['date']=(int)strtotime($emailHead->date); // imap_fetch_overview 可能没有 $email['uid']=$emailHead->uid; // 获取body,实际中,可点击后获取 $structure = imap_fetchstructure($inbox, 100); $imap_body = imap_fetchbody($inbox, 100,2); $body=''; switch ($structure->encoding) { case 3:$body= imap_base64($imap_body);break; case 4: $body= imap_qprint($imap_body);break; default: $body= $imap_body; } // 展示 file_put_contents("1.html",$body); } // 关闭 IMAP 连接 imap_close($inbox); ```