本文实例讲述了php使用socket调用http和smtp协议。分享给大家供大家参考,具体如下:
http协议请求报文格式
get
1
2
3
|
## 请求方法 请求文件路径?查询字符串 HTTP/协议版本号
## Host: 主机名:端口号
## Connection:close
|
post
1
2
3
4
5
6
|
## 请求方法 请求文件路径 HTTP/协议版本号
## Host: 主机名:端口号
## Content-type: application/x-www-form-urlencoded
## Content-length: 查询字符串长度
## Connection: close
## 查询字符串
|
api.php
1
2
3
|
<?php
echo $_SERVER [ "REQUEST_METHOD" ]. "<br/>" ;
print_r( $_REQUEST );
|
fsocketopen发送get请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?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请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?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等函数直接操作该网络连接。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?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客户端的功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<?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 );
|
参考文章:
https://www.zzvips.com/article/151234.html
https://www.zzvips.com/article/164860.html
希望本文所述对大家PHP程序设计有所帮助。
原文链接:https://blog.csdn.net/koastal/article/details/53149689
相关文章
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
- 64M VPS建站:能否支持高流量网站运行? 2025-06-10
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-25 80
-
2025-05-24 19
-
2025-05-29 67
-
WebHostingPad支持哪些类型的数据库,如何创建和管理?
2025-06-04 56 -
2025-05-27 38