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 相关文章推荐
php和js交互一例-PHP教程,PHP应用
Jan 03 PHP
PHP实现MVC开发得最简单的方法――模型
Apr 10 PHP
ezSQL PHP数据库操作类库
May 16 PHP
PHP取得一个类的属性和方法的实现代码
May 22 PHP
Apache服务器无法使用的解决方法
May 08 PHP
解析curl提交GET,POST,Cookie的简单方法
Jun 29 PHP
php读取文件内容的三种可行方法示例介绍
Feb 08 PHP
PHP中的插件机制原理和实例
Jul 08 PHP
yii2使用ajax返回json的实现方法
May 14 PHP
利用php的ob缓存机制实现页面静态化方法
Jul 09 PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 PHP
php+ajax实现文件切割上传功能示例
Mar 03 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
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
大家未必知道的Js技巧收藏
2008/04/07 Javascript
javascript concat数组累加 示例
2009/09/03 Javascript
javascript OFFICE控件测试代码
2009/12/08 Javascript
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
基于canvas的二维码邀请函生成插件
2017/02/14 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
简单明了区分escape、encodeURI和encodeURIComponent
2018/05/26 Javascript
react-native android状态栏的实现
2018/06/15 Javascript
基于nodejs的微信JS-SDK简单应用实现
2019/05/21 NodeJs
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
2020/08/06 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
原生js实现简单轮播图
2020/10/26 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
js面向对象方式实现拖拽效果
2021/03/03 Javascript
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
Python的Asyncore异步Socket模块及实现端口转发的例子
2016/06/14 Python
Python脚本处理空格的方法
2016/08/08 Python
浅述python中深浅拷贝原理
2018/09/18 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
Python实现图片批量加入水印代码实例
2019/11/30 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
Python OpenCV实现测量图片物体宽度
2020/05/27 Python
亿阳信通股份有限公司C#笔试题
2016/12/06 面试题
教师自我鉴定范文
2013/11/10 职场文书
ktv收银员岗位职责
2013/12/16 职场文书
学习之星事迹材料
2014/05/17 职场文书
党课心得体会范文
2014/09/09 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
2014年就业工作总结
2014/11/26 职场文书
初中信息技术教学计划
2015/01/22 职场文书
北大自主招生自荐信
2015/03/04 职场文书
范文之农村基层党建工作报告
2019/10/24 职场文书