php使用socket调用http和smtp协议实例小结


Posted in PHP onJuly 26, 2019

本文实例讲述了php使用socket调用http和smtp协议。分享给大家供大家参考,具体如下:

socket发送HTTP请求

http协议请求报文格式

get

## 请求方法 请求文件路径?查询字符串 HTTP/协议版本号
## Host: 主机名:端口号
## Connection:close

post

## 请求方法 请求文件路径 HTTP/协议版本号
## Host: 主机名:端口号
## Content-type: application/x-www-form-urlencoded
## Content-length: 查询字符串长度
## Connection: close
## 查询字符串

api.php

<?php
echo $_SERVER["REQUEST_METHOD"]."<br/>";
print_r($_REQUEST);

fsocketopen发送get请求

<?php
$url = "api.php";
$host = "127.0.0.1";
$port = 8080;
$param = ["name"=>"zhezhao","age"=>23];
$url .= "?".http_build_query($param);
$socket = fsockopen($host,$port,$errno,$errstr,10);
$request = "GET /${url} HTTP/1.1\r\n";
$request .= "Host:${host}:{$port}\r\n";
$request .= "Connection:close\r\n\r\n";
fwrite($socket,$request);
echo "<b>Request:</b><br/>".str_replace("\r\n","<br/>",$request);
echo "<hr/><b>Response:</b><br/>";
$response = "";
while ($out = fread($socket, 2048)) {
 $response .= $out;
}
echo str_replace("\r\n","<br/>",$response);
fclose($socket);

sockets扩展发送post请求

<?php
$url = "api.php";
$host = "127.0.0.1";
$port = 8080;
$param = ["name"=>"zhezhao","age"=>23];
$data = http_build_query($param);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $host,$port);
$request = "POST /${url} HTTP/1.1\r\n";
$request .= "Host:${host}:{$port}\r\n";
$request .= "Content-type:application/x-www-form-urlencoded\r\n";
$request .= "Content-length:".strlen($data)."\r\n";
$request .= "Connection:close\r\n\r\n";
$request .= "${data}";
socket_write($socket,$request);
echo "<b>Request:</b><br/>".str_replace("\r\n","<br/>",$request);
echo "<hr/><b>Response:</b><br/>";
$response = "";
while ($out = socket_read($socket, 2048)) {
 $response .= $out;
}
echo str_replace("\r\n","<br/>",$response);
socket_close($socket);

socket发送smtp请求

首先通过socket连接到smtp服务器,例如smtp.163.com 25,然后实现smtp发送邮件的必须参数即可。

HELO 主机名
AUTH LOGIN base64编码之后的发件人邮箱
base64编码之后的密码
##填写信封
MAIL FROM:<发件人邮箱>
RCPT TO:<收件人邮箱>
##填写信件内容
DATA
MIME-Version:1.0
To: 收件人邮箱
From: 发件人邮箱
Subject: 邮件主题

邮件内容

fsocketopen发送邮件

fsocketopenpfsocketopen是php机制本身的函数,可以直接调用,不需要安装扩展。以上两个函数可以打开一个网络连接或者一个Unix套接字连接,然后我们可以使用fwrite,fread,fclose,feof等函数直接操作该网络连接。

<?php
$user = "root@163.com";
$password = "root";
$mailto = "1234567@qq.com";
$subject = "fsocketopen发送邮件";
$body = "收到邮件了么,亲";
$sock = fsockopen("smtp.163.com",25);
fputs($sock,"HELO localhost\r\n");
echo fgets($sock, 512)."<br/>";
fputs($sock,"AUTH LOGIN ".base64_encode($user)."\r\n");
echo fgets($sock, 512)."<br/>";
fputs($sock,base64_encode($password)."\r\n");
echo fgets($sock, 512)."<br/>";
fputs($sock,"MAIL FROM:<${user}>\r\n");
echo fgets($sock, 512)."<br/>";
fputs($sock,"RCPT TO:<${mailto}>\r\n");
echo fgets($sock, 512)."<br/>";
fputs($sock,"DATA\r\n");
echo fgets($sock, 512)."<br/>";
$header = "MIME-Version:1.0\r\n";
$header .= "To: ${mailto}\r\n";
$header .= "From: ${user}\r\n";
$header .= "Subject: ${subject}\r\n";
fputs($sock, $header . "\r\n" . $body);
echo fgets($sock, 512)."<br/>";
fputs($sock, "\r\n.\r\n");
echo fgets($sock, 512)."<br/>";
fputs($sock,"QUIT\r\n");
fclose($sock);

sockets扩展发送邮件

sockets扩展的功能更加强大,可以搭建tcp/ip服务器,不过我们使用smtp协议发送邮件的例子,只需要使用到socket客户端的功能。

<?php
$user = "root@163.com";
$password = "root";
$mailto = "1234567@qq.com";
$subject = "sockets扩展发送邮件";
$body = "收到邮件了么,亲";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, "smtp.163.com",25);
socket_write($socket,"HELO localhost\r\n");
echo socket_read($socket, 512)."<br/>";
socket_write($socket,"AUTH LOGIN ".base64_encode($user)."\r\n");
echo socket_read($socket, 512)."<br/>";
socket_write($socket,base64_encode($password)."\r\n");
echo socket_read($socket, 512)."<br/>";
socket_write($socket,"MAIL FROM:<${user}>\r\n");
echo socket_read($socket, 512)."<br/>";
socket_write($socket,"RCPT TO:<${mailto}>\r\n");
echo socket_read($socket, 512)."<br/>";
socket_write($socket,"DATA\r\n");
echo socket_read($socket, 512)."<br/>";
$header = "MIME-Version:1.0\r\n";
$header .= "To: ${mailto}\r\n";
$header .= "From: ${user}\r\n";
$header .= "Subject: ${subject}\r\n";
socket_write($socket, $header . "\r\n" . $body);
echo socket_read($socket, 512)."<br/>";
socket_write($socket, "\r\n.\r\n");
echo socket_read($socket, 512)."<br/>";
socket_write($socket,"QUIT\r\n");
fclose($sock);

参考文章:

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
第七节 类的静态成员 [7]
Oct 09 PHP
在WIN98下以apache模块方式安装php
Oct 09 PHP
dedecms系统的广告设置代码 基础版本
Apr 09 PHP
给ECShop添加最新评论
Jan 07 PHP
php实现简易聊天室应用代码
Sep 23 PHP
深入解析PHP的Yii框架中的event事件机制
Mar 17 PHP
php简单创建zip压缩文件的方法
Apr 30 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
Aug 28 PHP
php下载文件,添加响应头的简单实例
Sep 22 PHP
PHP实现的堆排序算法详解
Aug 17 PHP
PHP+JS实现的实时搜索提示功能
Mar 13 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
Jun 16 PHP
php使用curl模拟多线程实现批处理功能示例
Jul 25 #PHP
yii框架使用分页的方法分析
Jul 25 #PHP
php实现的生成排列算法示例
Jul 25 #PHP
Yii框架中使用PHPExcel的方法分析
Jul 25 #PHP
PHP保留两位小数的几种方法
Jul 24 #PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
Jul 24 #PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 #PHP
You might like
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
js类型检查实现代码
2010/10/29 Javascript
Jquery图片滚动与幻灯片的实例代码
2013/04/08 Javascript
JS实现匀速运动的代码实例
2013/11/29 Javascript
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
2015/01/09 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
在vue中阻止浏览器后退的实例
2019/11/06 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
vue打开子组件弹窗都刷新功能的实现
2020/09/21 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
[02:37]TI8勇士令状不朽珍藏II视频展示
2018/06/23 DOTA
安装ElasticSearch搜索工具并配置Python驱动的方法
2015/12/22 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
selenium+python环境配置教程详解
2019/05/28 Python
使用python socket分发大文件的实现方法
2019/07/08 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
Python-numpy实现灰度图像的分块和合并方式
2020/01/09 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
"序列点" 是什么
2016/07/29 面试题
生物化工专业个人自荐信
2013/09/26 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
自我鉴定标准格式
2014/03/19 职场文书
继承公证书格式
2015/01/26 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书
Python Socket编程详解
2021/04/25 Python
利用Redis实现点赞功能的示例代码
2022/06/28 Redis