php获取socket连接的详细信息(php使用socket调用http和smtp协议实例小结)
php获取socket连接的详细信息
php使用socket调用http和smtp协议实例小结本文实例讲述了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发送邮件
fsocketopen
和pfsocketopen
是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 ); |
参考文章:
http://www.zzvips.com/article/151234.html
http://www.zzvips.com/article/164860.html
希望本文所述对大家PHP程序设计有所帮助。
原文链接:https://blog.csdn.net/koastal/article/details/53149689
- 通过接口访问mysql数据库(使用mysql记录从url返回的http GET请求数据操作)
- 如何看http状态码(10个常见的HTTP状态码详解)
- web中如何预防xss攻击(详解前端安全之JavaScript防http劫持与XSS)
- 关闭ssl证书验证模块(开启OCSP提升https证书验证效率解决Let’s Encrypt SSL证书访问慢的问题)
- php获取socket连接的详细信息(php使用socket调用http和smtp协议实例小结)
- nginx查看请求协议(Nginx之Http模块系列之autoindex模块的具体使用)
- laravel自定义实现服务提供者(laravel http 自定义公共验证和响应的方法)
- 远程访问服务器网络方案(基于http.server搭建局域网服务器过程解析)
- HTTP状态码的意思
- 什么是HttpHandler
- vue跨域代理怎么写(解决vue $http的get和post请求跨域问题)
- nginx的请求处理(nginx处理http请求实现过程解析)
- 宝塔部署ssl证书(宝塔面板设置SSL并开启HTTPS的方法)
- vmware虚拟机上建立http服务步骤(VMWare网络适配器三种模式实现过程解析)
- 异步调用中HttpContext.Current为null解决方法
- Server.UrlEncode与HttpUtility.UrlEncode的区别
- 2021款起亚霸锐到店了 更换车标,竞争宝马X5有戏吗(2021款起亚霸锐到店了)
- 新款起亚霸锐实拍,比普拉多气派,配3.0T V6,引入国内或许能大卖(新款起亚霸锐实拍)
- ()
- 张勇 阿里新任掌门人(阿里新任掌门人)
- 毛戈平全国第一柜花落银泰 高端国货迎来 高光 时刻(毛戈平全国第一柜花落银泰)
- 14岁丧父 20岁丧母,从苦难走向辉煌的银泰创始人沈国军(14岁丧父20岁丧母从苦难走向辉煌的银泰创始人沈国军)
热门推荐
- javascript中的this判定(Javascript中函数分类&this指向的实例详解)
- SCOPE_IDENTITY的用法
- web服务器搭建自己的网站(单台web服务器如何尽可能的提高网站性能)
- cssfloat和position功能(理解CSS浮动float、定位position)
- django部署(Django 中间键和上下文处理器的使用)
- laravel使用队列(基于laravel where的高级使用方法)
- mysql数据库事务处理(MySQL数据库事务与锁深入分析)
- Linux 下如何检查内存使用率(Linux 下如何检查内存使用率)
- html5div怎样居中(HTML5+CSS设置浮动却没有动反而在中间且错行的问题)
- UML对象图的介绍