记一次PHP实现接收邮件信息(我这里测试的腾讯企业邮件)
PHP实现接收邮件信息(我这里测试的腾讯企业邮件) , 其他的类型的没有测,应该只要更换pop3地址 端口号就可以。
代码如下(代码参考网络分享):
<?php
//此处查看链接状态
header("Content-type:text/html;charset=utf-8");
var_dump(fsockopen('pop.exmail.qq.com', 110, $error, $errorstr, 8));
// var_dump(fsockopen('pop.exmail.qq.com',110,$error,$errorstr,8));
print_r($error);
echo '<br/>';
$host = "pop.exmail.qq.com";
//‘tls://’为ssl协议加密,端口走加密端口
$user = "xxx@xxx.com";
//邮箱
$pass = "xxxxxx";
//密码
class Pop3
{
var $hostname = "";
// POP主机名
var $port = 110;
// 主机的POP3端口,一般是110号端口
var $timeout = 5;
// 连接主机的最大超时时间
var $connection = 0;
// 保存与主机的连接
var $state = "DISCONNECTED";
// 保存当前的状态
var $debug = 0;
// 做为标识,是否在调试状态,是的话,输出调试信息
var $err_str = '';
// 如果出错,这里保存错误信息
var $err_no;
//如果出错,这里保存错误号码
var $resp;
// 临时保存服务器的响应信息
var $apop;
// 指示需要使用加密方式进行密码验证,一般服务器不需要
var $messages;
// 邮件数
var $size;
//各邮件的总大小
var $mail_list;
// 一个数组,保存各个邮件的大小及其在邮件服务器上序号
var $head = array();
// 邮件头的内容,数组
var $body = array();
// 邮件体的内容,数组;
function pop3($server = "192.100.100.1", $port = 110, $time_out = 5)
{
$this->hostname = $server;
$this->port = $port;
$this->timeout = $time_out;
return true;
}
function Open()
{
if ($this->hostname == "") {
$this->err_str = "无效的主机名!!";
return false;
}
if ($this->debug) {
echo "正在打开 {$this->hostname},{$this->port},{$err_no}, {$err_str}, {$this->timeout}<BR>";
}
if (!($this->connection = @fsockopen($this->hostname, $this->port, $err_no, $err_str, $this->timeout))) {
$this->err_str = "连接到POP3服务器失败,错误信息:" . $err_str . "错误号:" . $err_no;
return false;
} else {
$this->getresp();
if ($this->debug) {
$this->outdebug($this->resp);
}
if (substr($this->resp, 0, 3) != "+OK") {
$this->err_str = "服务器返回无效的信息:" . $this->resp . "请检查POP服务器是否正确";
return false;
}
$this->state = "AUTHORIZATION";
return true;
}
}
function getresp()
{
for ($this->resp = "";;) {
if (feof($this->connection)) {
return false;
}
$this->resp .= fgets($this->connection, 100);
$length = strlen($this->resp);
if ($length >= 2 && substr($this->resp, $length - 2, 2) == "\r\n") {
$this->resp = strtok($this->resp, "\r\n");
return true;
}
}
}
//这个方法取得服务器端的返回信息并进行简单的处理:去掉最后的回车换行符,将返回信息保存在resp这个内部变量中。这个方法在后面的多个操作中都将用到。另外,还有个小方法也在后面的多个操作中用到:
function outdebug($message)
{
echo htmlspecialchars($message) . "<br>\n";
}
//它的作用就是把调试信息$message显示出来,并把一些特殊字符进行转换以及在行尾加上<br>标签,这样是为了使其输出的调试信息便于阅读和分析。
//建立起与服务器的sock连接之后,就要给服务器发送相关的命令了(请参见上面的与服务器对话的过程)从上面对 POP对话的分析可以看到,每次都是发送一条命令,然后服务器给予一定的回应,如果命令的执行是对的,回应一般是以+OK开头,后面是一些描述信息,所以,我们可以做一个通过发送命令的方法:
function command($command, $return_lenth = 1, $return_code = '+')
{
if ($this->connection == 0) {
$this->err_str = "没有连接到任何服务器,请检查网络连接";
return false;
}
if ($this->debug) {
$this->outdebug(">>> {$command}");
}
if (!fputs($this->connection, "{$command}\r\n")) {
$this->err_str = "无法发送命令" . $command;
return false;
} else {
$this->getresp();
if ($this->debug) {
$this->outdebug($this->resp);
}
if (substr($this->resp, 0, $return_lenth) != $return_code) {
$this->err_str = $command . " 命令服务器返回无效:" . $this->resp;
return false;
} else {
return true;
}
}
}
//这个方法可以接受三个参数: $command--> 发送给服务器的命令; $return_lenth,$return_code ,指定从服务器的返回中取多长的值做为命令返回的标识以及这个标识的正确值是什么。对于一般的pop操作来说,如果服务器的返回第一个字符为"+",则可以认为命令是正确执行了。也可以用前面提到过的三个字符"+OK"做为判断的标识。
//下面介绍的几个方法则可以按照前述收取信件的对话去理解,因为有关的内容已经在前面做了说明,因此下面的方法不做详细的说明,请参考其中的注释:
function Login($user, $password)
{
if ($this->state != "AUTHORIZATION") {
$this->err_str = "还没有连接到服务器或状态不对";
return false;
}
if (!$this->apop) {
//服务器是否采用APOP用户认证
if (!$this->command("USER {$user}", 3, "+OK")) {
return false;
}
if (!$this->command("PASS {$password}", 3, "+OK")) {
return false;
}
} else {
if (!$this->command("APOP {$user} " . md5($this->greeting . $password), 3, "+OK")) {
return false;
}
}
$this->state = "TRANSACTION";
// 用户认证通过,进入传送模式
return true;
}
function stat()
{
if ($this->state != "TRANSACTION") {
$this->err_str = "还没有连接到服务器或没有成功登录";
return false;
}
if (!$this->command("STAT", 3, "+OK")) {
return false;
} else {
$this->resp = strtok($this->resp, " ");
$this->messages = strtok(" ");
// 取得邮件总数
$this->size = strtok(" ");
//取得总的字节大小
return true;
}
}
function listmail($mess = null, $uni_id = null)
{
if ($this->state != "TRANSACTION") {
$this->err_str = "还没有连接到服务器或没有成功登录";
return false;
}
if ($uni_id) {
$command = "UIDL ";
} else {
$command = "LIST ";
}
if ($mess) {
$command .= $mess;
}
if (!$this->command($command, 3, "+OK")) {
return false;
} else {
$i = 0;
$this->mail_list = array();
$this->getresp();
while ($this->resp != ".") {
$i++;
if ($this->debug) {
$this->outdebug($this->resp);
}
if ($uni_id) {
$this->mail_list[$i][num] = strtok($this->resp, " ");
$this->mail_list[$i][size] = strtok(" ");
} else {
$this->mail_list[$i]["num"] = intval(strtok($this->resp, " "));
$this->mail_list[$i]["size"] = intval(strtok(" "));
}
$this->getresp();
}
return true;
}
}
function getmail($num = 1, $line = -1)
{
if ($this->state != "TRANSACTION") {
$this->err_str = "不能收取信件,还没有连接到服务器或没有成功登录";
return false;
}
if ($line < 0) {
$command = "RETR {$num}";
} else {
$command = "TOP {$num} {$line}";
}
if (!$this->command("{$command}", 3, "+OK")) {
return false;
} else {
$this->getresp();
$is_head = true;
while ($this->resp != ".") {
// . 号是邮件结束的标识
if ($this->debug) {
$this->outdebug($this->resp);
}
if (substr($this->resp, 0, 1) == ".") {
$this->resp = substr($this->resp, 1, strlen($this->resp) - 1);
}
if (trim($this->resp) == "") {
// 邮件头与正文部分的是一个空行
$is_head = false;
}
if ($is_head) {
$this->head[] = $this->resp;
} else {
$this->body[] = $this->resp;
}
$this->getresp();
}
return true;
}
}
// end function
function dele($num)
{
if ($this->state != "TRANSACTION") {
$this->err_str = "不能删除远程信件,还没有连接到服务器或没有成功登录";
return false;
}
if (!$num) {
$this->err_str = "删除的参数不对";
return false;
}
if ($this->command("DELE {$num} ", 3, "+OK")) {
return true;
} else {
return false;
}
}
//通过以上几个方法,我们已经可以实现邮件的查看、收取、删除的操作,不过别忘了最后要退出,并关闭与服务器的连接,调用下面的这个方法:
function Close()
{
if ($this->connection != 0) {
if ($this->state == "TRANSACTION") {
$this->command("QUIT", 3, "+OK");
}
fclose($this->connection);
$this->connection = 0;
$this->state = "DISCONNECTED";
}
}
}
//参数1:为链接地址,参数2:为端口号,参数3为过载时间
$rec = new pop3($host, 110, 2);
if (!$rec->open()) {
die($rec->err_str);
}
echo "open ";
if (!$rec->login($user, $pass)) {
die($rec->err_str);
}
echo "login";
if (!$rec->stat()) {
die($rec->err_str);
}
echo "共有" . $rec->messages . "封信件,共" . $rec->size . "字节大小<br>";
if ($rec->messages > 0) {
if (!$rec->listmail()) {
die($rec->err_str);
}
// echo "有以下信件:<br>";
// for ($i=1;$i<=count($rec->mail_list);$i++)
// {
// echo "信件".$rec->mail_list[$i]['num']."大小:".$rec->mail_list[$i]['size']."<BR>";
// }
$rec->getmail(count($rec->mail_list));
// echo "邮件头的内容:<br>";
// for ($i=0;$i<count($rec->head);$i++)
// echo htmlspecialchars($rec->head[$i])."<br>\n";
echo "邮件正文 :<BR>";
for ($i = 0; $i < count($rec->body); $i++) {
//如果加密返回
echo htmlspecialchars(quoted_printable_decode(base64_decode($rec->body[$i]))) . "<br>\n"; //如果内容明文直接输出
// echo htmlspecialchars($rec->body[$i])."<br>\n";
}
}
$rec->close();
记一次PHP实现接收邮件信息(我这里测试的腾讯企业邮件)的更多相关文章
- outlook配置其他邮箱登录如qq邮箱或登录无邮件信息记录
今天加班想想自己outlook还没登登录过,于是想着登录一下outlook方便管理邮箱信息,才发现原来登录邮箱都要配置,感觉真是醉了.下面开始正式的配置流程. 选择添加账户 首先,点击文件选择账户设置 ...
- 接收新信息,在会话中看不到(thread表数据插入/更新失败)
分析原因:收到短信,sms表插入信息,触发器会自动更新thread表,更新失败导致一直有一条未读信息数量显示,但在会话列表中却看不到. (偶现,低概率. 解决方法:接收新信息插入后,立即查询threa ...
- java解析邮箱中的邮件信息
import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import ...
- MQTT的学习研究(四)moquette-mqtt 的使用之mqtt Blocking API客户端订阅并接收主题信息
在上面两篇关于mqtt的broker的启动和mqtt的服务端发布主题信息之后,我们客户端需要订阅相关的信息并接收相关的主题信息. package com.etrip.mqtt; import java ...
- 记一次邮件推送的坑,c#基于smtp使用腾讯企业邮箱发送邮件总是失败的原因
今天在弄企业邮箱推送的东西,原版代码是这样的 public void SendEmail(string title, string content) { try { MailMessage mailM ...
- 邮件格式(HTML/TXT),TXT为文本邮件
<?phpclass smtp{/* Public Variables */var $smtp_port;var $time_out;var $host_name;var $log_file;v ...
- 利用腾讯企业邮箱开放API获取账户未读邮件数初探
公司一直使用腾讯提供的免费企业邮箱服务,今天用管理员帐户登录后发现,原来现在腾讯的企业邮箱也开放了部分API 你可以通过开放接口实现以下功能: 数据同步 数据同步可以帮助你同步部门成员信息,你还可以创 ...
- 测试MailUtils,作用是发邮件
package cn.itcast.test; import java.io.IOException; import javax.mail.MessagingException; import jav ...
- MVC4/5+jquery+bootstrap样式+dataTables+linq+WCF+EF6后台和前台的框架集合!好蛋疼哦!数据库支持MYSQL 和MSSQL,oracle。集成腾讯企业邮箱收邮件同步用户SSO登陆等功能。
花费了我好多心血,才做出来,下个项目准备用这个框架! 大家有没有做这方面的可以交流一下! 花费了我好多心血,才做出来,下个项目准备用这个框架! 大家有没有做这方面的可以交流一下! 花费了我好多心血,才 ...
随机推荐
- C# 两个结构相同的类进行赋值
假入两个类A类和B类不有任何继承关系,它们属性名相同,怎么给他们互相赋值呢?下面的方法就可以了. public L SetProperties<T, L>(T t) where L : n ...
- T-SQL语法学习一(持续更新)
T-SQL语法学习(一) 第一节 不常用语句 不常用语句-指的是一些不常用的查询语句,不针对业务数据查询 SET STATISTICS IO ON(用于查询逻辑读取次数,物理读取次数) 图片 sele ...
- shell语句
一.判断目录是否存在:#!/bin/bash#/bin/bash -n filename.sh 判断语句是否正确 DIR=/root/zhjif [ ! -d $DIR ];then mkdir $D ...
- Python学习---深浅拷贝的学习
浅拷贝copy(): 修改字符串,原来的不变: 更改列表,2个同时修改,以为列表里面还涉及一个指针的索引. 简单讲就是copy()只是简单地copy了第一层,第二层不被copy 深拷贝: 需要单独的 ...
- kill -9 和kill-15的区别
kill -9大家应该是非常熟悉的,杀死进程一般用kill -9的吧. 今天接触到kill -15,kill -15也是杀死进程的.那个kill -15和kill -9有什么区别呢? 其实kill - ...
- node-7.2.1 already installed, it's just not linked
直接在terminal下运行以卸载node和nvm: sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,shar ...
- PHP-------ajax返回值 返回JSON 数据
ajax返回值 返回JSON 数据 ajax返回值 有text JSON ajax返回值 返回JSON 数据 <title>无标题文档</title> <sc ...
- C#处理List<object>重复数据的问题
private class ListDistinct : IEqualityComparer<object> { public bool Equals(object x, object y ...
- springAOP(Aspect)权限访问页面
1.XML进行配置切面 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h ...
- java中数据类型的范围
前言:最近:本菜鸡在准备pat,可以每次遇到数据类型的时候都得去查找范围,因此本着学习的目的,来总结一下java中的数据类型. 因此我用mindManager做了一个思维图