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 strstr查找字符串中是否包含某些字符的查找函数
Jun 03 PHP
php 解决旧系统 查出所有数据分页的类
Aug 27 PHP
php标签云的实现代码
Oct 10 PHP
php模板函数 正则实现代码
Oct 15 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
Jun 09 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 PHP
PHP中常用的输出函数总结
Sep 22 PHP
PHP使用正则表达式获取微博中的话题和对象名
Jul 18 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
Sep 23 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
Apr 07 PHP
thinkPHP框架实现的简单计算器示例
Dec 07 PHP
laravel框架与其他框架的详细对比
Oct 23 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中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
PHP+iframe模拟Ajax上传文件功能示例
2019/07/02 PHP
XHTML-Strict 内允许出现的标签
2006/12/11 Javascript
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
2010/03/16 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
jQuery 实现自动填充邮箱功能(带下拉提示)
2014/10/14 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
js实现延迟加载的几种方法
2017/04/24 Javascript
javascript  删除select中的所有option的实例
2017/09/17 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
使用node打造自己的命令行工具方法教程
2018/03/26 Javascript
详解easyui基于 layui.laydate日期扩展组件
2018/07/18 Javascript
Angular ElementRef简介及其使用
2018/10/01 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
python实现Floyd算法
2018/01/03 Python
TensorFlow saver指定变量的存取
2018/03/10 Python
Python运维开发之psutil库的使用详解
2018/10/18 Python
python读取TXT每行,并存到LIST中的方法
2018/10/26 Python
Python判断telnet通不通的实例
2019/01/26 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
2021/01/07 Python
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
原生canvas制作画图小工具的踩坑和爬坑
2020/06/09 HTML / CSS
大学生护理专业自荐信
2013/10/03 职场文书
电厂职工自我鉴定
2014/02/20 职场文书
小学生手册家长评语
2014/04/16 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
企业安全生产责任书范本
2014/07/28 职场文书
感谢信模板大全
2015/01/23 职场文书
会计专业自荐信范文
2015/03/05 职场文书