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扩展函数
Oct 09 PHP
PHP实现的功能是显示8条基色色带
Oct 09 PHP
PR值查询 | PageRank 查询
Dec 20 PHP
解析获取优酷视频真实下载地址的PHP源代码
Jun 26 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
Feb 24 PHP
php中JSON的使用方法
Apr 30 PHP
浅谈PHP中其他类型转化为Bool类型
Mar 28 PHP
php格式化json函数示例代码
May 12 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
Nov 16 PHP
Zend Framework入门应用实例详解
Dec 11 PHP
PHP更安全的密码加密机制Bcrypt详解
Jun 18 PHP
PHP数组访问常用方法解析
Sep 05 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
PHP管理依赖(dependency)关系工具 Composer 安装与使用
2014/08/18 PHP
php绘制一条弧线的方法
2015/01/24 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
有趣的javascript数组定义方法
2010/09/10 Javascript
JQuery模板插件 jquery.tmpl 动态ajax扩展
2011/11/10 Javascript
js动态改变select选择变更option的index值示例
2014/07/10 Javascript
JS实现alert中显示换行的方法
2015/12/17 Javascript
js判断当前页面用什么浏览器打开的方法
2016/01/06 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
ES6新特性:使用export和import实现模块化详解
2017/07/31 Javascript
浅谈Angular路由复用策略
2017/10/04 Javascript
Vue2 SSR渲染根据不同页面修改 meta
2017/11/20 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
javascript+HTML5 canvas绘制时钟功能示例
2019/05/15 Javascript
基于vue实现圆形菜单栏组件
2019/07/05 Javascript
js实现弹幕飞机效果
2020/08/27 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
利用Python爬取微博数据生成词云图片实例代码
2017/08/31 Python
pyqt5自定义信号实例解析
2018/01/31 Python
Python遍历numpy数组的实例
2018/04/04 Python
python实现汽车管理系统
2018/11/30 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
Python中拆分字符串的操作方法
2019/07/23 Python
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
购买原创艺术品:Zatista
2019/11/09 全球购物
游戏商店:Eneba
2020/04/25 全球购物
java程序员面试交流
2012/11/29 面试题
大学军训通讯稿
2014/01/13 职场文书
刑事辩护授权委托书格式
2014/10/13 职场文书
初中信息技术教学计划
2015/01/22 职场文书
教师节寄语2015
2015/03/23 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书