本文实例讲述了php使用socket调用http和smtp协议。分享给大家供大家参考,具体如下:
socket发送HTTP请求
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 );
|
参考文章:
http://www.zzvips.com/article/151234.html
http://www.zzvips.com/article/164860.html
希望本文所述对大家PHP程序设计有所帮助。
原文链接:https://blog.csdn.net/koastal/article/details/53149689