当前位置: 首页 > 后端技术 > PHP

使用php-imap查询和操作邮件收件箱

时间:2023-03-30 02:01:08 PHP

最近在一个业务场景中,主动接收并解析用户发送的邮件。我用php-imap实现了这个需求,记录一下。确定读取电子邮件的实现方式的协议有两种:POP3和IMAP。区别:POP3协议允许邮件客户端下载服务器上的邮件,但客户端的操作不会反馈给服务器。IMAP提供了webmail和邮件客户端的双向通信,客户端的操作会反馈给服务器,而邮件的操作,服务器上的邮件也会执行相应的动作。需求要求在处理完用户的邮件后,将邮件标记为已处理,所以选择IMAP协议。安装依赖本地和服务器php,需要安装imap扩展。在项目的composer.json中添加php-imap扩展如下:"require":{"php-imap/php-imap":"^3.1",},配置相关服务命名空间app\library\service\mail;usePhpImap\Exceptions\ConnectionException;usePhpImap\Mailbox;/***邮件接收服务邮件API接口*ClassPlayService*@packageapp\library\service*/classImapService{public$path='{imap.263.net:993/imap/ssl}收件箱';//IMAP服务器和邮箱文件夹public$login='user@263.cn';//之前配置邮箱的用户名public$password='pwd';//之前配置的用户名的密码public$dir=null;//保存附件的目录(可选)public$encoding='UTF-8';//服务器编码(可选)public$mailbox;publicfunction__construct(){$this->mailbox=newMailbox($this->path,$this->login,$this->password,$this->dir,$this->encoding);}获取所有未读邮件列表public函数unSeenList(){try{$mail_ids=$this->mailbox->searchMailbox('UNSEEN');}catch(ConnectionException$ex){die('IMAP连接失败:'.$ex->getMessage());}catch(\Exception$ex){die('发生错误:'.$ex->getMessage());}//如果$mailsIds为空,则无法找到任何电子邮件if(!$mail_ids){die('Mailboxisempty');}尝试{$info=$this->mailbox->getMailsInfo($mail_ids);}catch(ConnectionException$ex){echo"IMAP连接失败:".$前;死();}return['ids'=>$mail_ids,'list'=>$info];}将一些邮件标记为已读/***@paramarray$mail_ids*@returnmixed*/publicfunctionmarkRead($mail_ids){return$this->mailbox->markMailsAsRead($mail_ids);}搜索指定主题的邮件并标记为已读$imap=newImapService();$condition='UNSEENSUBJECT"'.$title.'"SINCE"'.date('Y-m-d',strtotime('-1days')).'"FROM'.$邮件;$数据['邮件']=$imap->mailbox->searchMailbox($condition);if(!empty($data['mail'])){$data['info']=$imap->mailbox->getMailsInfo($data['邮件']);如果($params['mark']==1){$data['mark']=$imap->markRead(array_column($data['info'],'uid'));}}