PHP+socket+SMTP、POP3协议发送、接收邮件
、实现SMTP协议的类dsmtp.cls.php:<?php
// 通过socket实现SMTP协议的功能
// version: 1.1
// author : DCC
// create : 2014-01-17 23:38:24
// modify : 2014-01-18 16:59:04
// more : http://www.thinkful.cn/archives/389.html
class Dmail_smtp{
var $socket;
var $host;
var $user;
var $pwd;
var $port;
var $nickname;
var $weburl;
// 初始化
function__construct($host, $user, $pwd, $port=, $webname='大超超在思考', $weburl="www.thinkful.cn"){
$this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$this->host = $host;
$this->user = $user;
$this->pwd = $pwd;
$this->port = $port;
$this->nickname = $webname;
$this->weburl = $weburl;
}
// 发邮件
function smtp($to, $from, $subject, $body){
$conn = socket_connect($this->socket, $this->host, $this->port);
if( $conn ){
// 接收连接成功的消息
$msg = "succeed connect to ".$this->host.":".$this->port."\n";
$msg .= $this->_r();
// 开始认证过程
$this->_w("HELO ".$this->weburl."\r\n");
$msg .= $this->_r();
$this->_w("AUTH LOGIN ".base64_encode($this->user)."\r\n");
$msg .= $this->_r();
$this->_w(base64_encode($this->pwd)."\r\n");
$msg .= $this->_r();
// 认证成功
if( stripos($msg, '235 Authentication successful')!==FALSE ){
$this->_w("MAIL FROM:<{$from}>\r\n");
$msg .= $this->_r();
$this->_w("RCPT TO:<{$to}>\r\n");
$msg .= $this->_r();
$this->_w("DATA\r\n");
$msg .= $this->_r();
// 发送头和正文
$data = $this->_genHeader($to, $from, $subject)
."\r\n".$this->_genBody($body);
$this->_w($data);
$this->_w("\r\n.\r\n");
$msg .= $this->_r();
$this->_w("QUIT\r\n");
$msg .= $this->_r();
}
}
return $msg;
}
// 生成头部
private function _genHeader($to, $from, $subject){
$header = "MIME-Version:1.0\r\n";
$header .= "Content-Type: text/plain; charset=\"utf-8\"\r\n";
$header .= "Subject: =?utf-8?B?".base64_encode($subject)."?=\r\n";
$header .= "From: ".$this->nickname." <".$from.">\r\n";
$header .= "To: ".$to."\r\n";
$header .= "Date: ".date("r")."\r\n";
list($msec, $sec) = explode(" ", microtime());
$header .= "Message-ID: <DCC_".date("YmdHis").".".($msec*).".".$from.">\r\n";
return $header;
}
// 生成正文
private function _genBody($body){
$body = preg_replace("/(^|(\r\n))(\.)/", "\1.\3", $body);
return $body;
}
// @发送控制流
// var: 控制代码
private function _w($s){
socket_write($this->socket, $s);
}
// @读取返回的数据
private function _r(){
return socket_read($this->socket, );
}
}
、实现POP3协议的类dpop3.cls.php:
<?php
// 通过socket实现pop3协议的功能
// version: 1.2
// author : DCC
// create : 2014-01-18 11:26:53
// modify : 2014-01-18 22:57:26
// more : http://www.thinkful.cn/archives/389.html
class Dmail_pop3{
var $socket;
var $host;
var $user;
var $pwd;
var $port;
var $content;
// 初始化
function __construct($host, $user, $pwd, $port=){
$this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$this->host = $host;
$this->user = $user;
$this->pwd = $pwd;
$this->port = $port;
}
// 收邮件
function pop3(){
$conn = socket_connect($this->socket, $this->host, $this->port);
if( $conn ){
// 接收连接成功的消息
$msg = "DCC: succeed connect to ".$this->host.":".$this->port."\n";
$msg .= $this->_r();
// 开始认证过程
$this->_w("USER ".$this->user."\r\n");
$msg .= $this->_r();
$this->_w("PASS ".$this->pwd."\r\n");
$msg .= $this->_r();
// 认证成功
if( substr_count($msg, '+OK')>= ){
//向服务器发送请求邮箱信息
$this->_w("STAT\r\n");
$mail_info = $this->_r();
$msg .= $mail_info;
preg_match('/\+OK\s(\d+)\s(\d+)/', $mail_info, $m);
$mail_num = $m[];
$mail_len = $m[];
//向服务器发送邮件i信息的请求
$this->content = '';
for( $i=; $i<=$mail_num; $i++ ){
// 查看该邮件的信息
$this->_w("LIST {$i}\r\n");
usleep();// waiting 0.16s
$mail_info = $this->_r();
$msg .= $mail_info;
preg_match('/\+OK\s(\d+)\s(\d+)/', $mail_info, $m);
//接收服务器返回的信息
$this->_w("RETR {$i}\r\n");
$msg.= 'DCC: reading mail(id='.$m[].')\'s content(length='.$m[].'byte):'."\n";
$data = '';
while( strlen($data)<$m[] ){
$msg .= '. ';
$data .= socket_read($this->socket, );
}
$this->content .= $data;
$msg.= "\nDCC: mail(id=".$m[].')\'s content(length='.$m[].'byte) read complete.'."\n";
}
}
}
return $msg;
}
// 返回收取邮件内容
function getContent(){
return $this->content;
}
// @发送控制流
// var: 控制代码
private function _w($s){
socket_write($this->socket, $s);
}
// @读取返回的数据
// var: 数据长度
private function _r($len=){
return socket_read($this->socket, $len);
}
}
、界面——代码就不贴出来了,看基本调用方法:
// 调用SMTP时
require_once 'dsmtp.cls.php';
$host = "smtp.qq.com";
// 使用QQ邮箱和密码
$user = '*******@qq.com';
$pwd = '*******';
$dmail = new Dmail_smtp($host, $user, $pwd);
$msg = $dmail->smtp($to, $from, $subject, $body);
// ********************************
// ********************************
// 调用POP3时(后续处理复杂一点)
require_once 'dpop3.cls.php';
$host = "pop.qq.com";
$dmail = new Dmail_pop3($host, $user, $pwd);
$msg = $dmail->pop3();
$ret = $msg;
if( strpos($msg, 'read complete')!==FALSE ){
$ct = $dmail->getContent();
$mail_list_arr = explode('X-QQ-SSF: ', $ct);
array_shift($mail_list_arr);// 去除第一个
$mail_list_arr = array_reverse($mail_list_arr);
foreach( $mail_list_arr as $v ){
// 中文标题的处理
if( preg_match('/Subject: =\?([^?]+)\?B\?([^?]+)\?=/i', $v, $subject) ){
$tmp_s = base64_decode($subject[]);
$tmp_s = $subject[]=='gbk'||$subject[]=='gb2312'? iconv('gbk', 'utf-8', $tmp_s) : $tmp_s;
}
// 英文标题
else if( preg_match('/Subject: (.*?)\r\n/i', $v, $subject) ){
$tmp_s = $subject[];
}
else{
$tmp_s = '邮件标题';
}
preg_match('/From: [^<]+<(.*?)>/i', $v, $from);
preg_match('/Date: (.*?)\r\n/i', $v, $date);
$mail_list .= $tmp_s.'|#DCC_LIST_INNER#|'
.$from[].'|#DCC_LIST_INNER#|'
.$date[].'|#DCC_MAIL_LIST_SEP#|';
}
$ret .= '|#DCC_POP3_DATA_SEP#|'.$mail_list;
}
echo $ret;
die();
PHP+socket+SMTP、POP3协议发送、接收邮件的更多相关文章
- 网络编程--使用TCP协议发送接收数据
package com.zhangxueliang.tcp; import java.io.IOException; import java.io.OutputStream; import java. ...
- outlook 2016 for windows 每次刷新发送接收邮件会弹出登陆界面
Q: outlook2016 for windows 每次刷新发送接收邮件会弹出登陆界面,office365 ProPlus 都是正常激活了,Word 和Excel都不存在此类问题 A: 排除用户的o ...
- python3:利用SMTP协议发送QQ邮件+附件
转载请表明出处:https://www.cnblogs.com/shapeL/p/9115887.html 1.发送QQ邮件,首先必须知道QQ邮箱的SMTP服务器 http://service.mai ...
- SMTP协议及POP3协议-邮件发送和接收原理(转)
本文转自https://blog.csdn.net/qq_15646957/article/details/52544099 感谢作者 一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 ...
- 邮件实现详解(二)------手工体验smtp和pop3协议
上篇博客我们简单介绍了电子邮件的发送和接收过程,对参与其中的邮件服务器,邮件客户端软件,邮件传输协议也有简单的介绍.我们知道电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行传递必须 ...
- SMTP协议解读以及如何使用SMTP协议发送电子邮件
电子邮件协议中POP3协议用于接收邮件,SMTP协议用于发送邮件.SMTP的全称为Simple Mail Transfer Protocol,也就是简单邮件传输协议,字如其名. 相较于POP3而言 ...
- 使用python发送和接收邮件
关于电子邮件 大学之前,基本不用邮箱,所以基本感觉不到它的存在,也不知道有什么用:然而大学之后,随着认识的人越来越多,知识越来越广泛,邮箱已然成为很重要的通讯工具,大学一些课程作业需要有邮箱发给老师, ...
- Java发送QQ邮件
面试的时候被问到这个问题,别人问我用Java发过邮件没有,被问得一脸懵逼.然后就研究了一下,不是很难,按照网上的方法折腾了几天就搞出来了. 首先,使用QQ邮箱发送邮件之前需要在邮箱里面配置,开启pop ...
- 通过Java发送邮件和接收邮件的工具类
一.第一种 使用SMTP协议发送电子邮件 第一步:加入mail.jar包 (1)简单类型 package com.souvc.mail; import java.util.Date; import j ...
随机推荐
- hdu 2187 悼念512汶川大地震遇难同胞——老人是真饿了
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2187 题目简问: 解题思路: 已知给出了 总钱数 和 一共的种类 1. 对给出的大米,按照价格进行升序 ...
- 图解equals与hashcode方法相等/不相等的互相关系
图解:比如equals相等的箭头指向hashcode相等,表示equals相等那么必有hashcode相等.而有两个箭头指向别人的表示可能是其中之一,比如hashcode相等,那么有可能equals相 ...
- [整理]Code::Blocks使用遇到的问题
在使用其编写C小程序的过程总会遇到些问题,特整理如下: 1.无法调试 注意的是项目所在的文件路径不能包含中文. 2.头文件接口函数申明引用无效 查看头文件是否处于可编译状态,左侧项目文件列表里是文件名 ...
- 修改Flume-NG的hdfs sink解析时间戳源码大幅提高写入性能
Flume-NG中的hdfs sink的路径名(对应参数"hdfs.path",不允许为空)以及文件前缀(对应参数"hdfs.filePrefix")支持正则解 ...
- Run UliPad 4.1 Under Windows 7 64bit and wxPython 3.0.2
Abstract: UliPad that is developed by limodou is an excellent code editor. It works well with wxPyth ...
- JVM是如何分配和回收内存?有实例!
上一篇博客我简单介绍了下如何手动计算一个Java对象到底占用多少内存?今天就想聊下这个内存JVM到底是是如何分配和回收的. Java整体来说还是一个GC比较友好的语言,无论是分代的垃圾收集,还是基于G ...
- Xcode 4.6.3 Bug - .m 文件不能正常打开,uitableveiwController
当打开.m文件时尤其是自定义的继承uitableviewcontroler的m 文件.不能滑动,不能正常显示. 解决方法: 用文本编辑器打开这个文件,关闭xcode .然后在继承uitableview ...
- HTML5 自制本地网页视频播放器
HTML5初试:本地视频用网页打开啦半个广告都可以没有,看来暴风什么的快要淘汰了. 视频格式还是有要求的,看来要备一个转码器. 格式 IE Firefox Opera Chrome Safari Og ...
- 用chrome模拟微信浏览器访问需要OAuth2.0网页授权的页面
现在很流行微信网页小游戏,用html5制作的小游戏移过来,可以放到微信浏览器中打开,关键是可以做成微信分享朋友圈的形式,大大提高游戏的传播,增强好友的游戏互动. 微信浏览器中打开网页游戏效果还不错,对 ...
- 【OpenStack】OpenStack系列1之Python虚拟环境搭建
安装virtualenv相关软件包 安装:yum install python-virtualenv* -y 简介,安装包主要包括, python-virtualenv:virtualenv用于创建独 ...