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 程序员也要学会使用“异常”
Jun 16 PHP
php学习之流程控制实现代码
Jun 09 PHP
Zend的AutoLoad机制介绍
Sep 27 PHP
PHP数据类型之整数类型、浮点数的介绍
Apr 28 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
Jun 29 PHP
php字符编码转换之gb2312转为utf8
Oct 28 PHP
smarty简单入门实例
Nov 28 PHP
PHP在linux上执行外部命令的方法
Feb 06 PHP
PHP连接MySQL进行增、删、改、查操作
Feb 19 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
Jun 12 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
php&amp;java(三)
2006/10/09 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
2011/05/02 PHP
php基础学习之变量的使用
2011/06/09 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
2017/06/02 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
javascript 原型模式实现OOP的再研究
2009/04/09 Javascript
不安全的常用的js写法
2009/09/15 Javascript
JavaScript创建一个欢迎cookie弹出窗实现代码
2013/03/15 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
jquery移动点击的项目到列表最顶端的方法
2015/06/24 Javascript
基于Jquery easyui 选中特定的tab
2015/11/17 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
2017/05/17 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
vue实现移动端省市区选择
2019/09/27 Javascript
javscript 数组扁平化的实现
2020/02/03 Javascript
JavaScript实现移动小精灵的案例代码
2020/12/12 Javascript
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
2017/07/24 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
Python os.access()用法实例
2019/02/18 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
德国家具折扣店:POCO
2020/02/28 全球购物
会计自我鉴定
2013/11/02 职场文书
费用会计岗位职责
2014/01/01 职场文书
政治思想表现评语
2014/05/04 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
普通党员对照检查材料
2014/09/24 职场文书
信息技术国培研修日志
2015/11/13 职场文书
关于Vue中的options选项
2022/03/22 Vue.js