用socket发邮件,socket发送邮件是指上就是通过客户端向邮件服务器发送以上的命令,从而实现SMTP协议来达到发送邮件的目的,但是于邮件服务器交互的时候,不是一下子就结束了,是一条指令,一条指令的发,返回的结果如果是正常 比如 220,250,334,才能继续向下
看这个东西都是网上看的别人的资料,收集了一些觉得别人说的不错的,另外还有一个 RFC文档 ,将smtp,和扩展的MIME头,将的是非常的详细了.(虽然很多我都看不懂)
stmp协议介绍 算找到的资料中最详细的了
别人的blog
别人的blog
别人的blog (这位兄弟些了好多blog来介绍的)
一些状态码(不是 http 状态码)
*. 500 格式错误,命令不可识别(此错误也包括命令行过长)
*. 501 参数格式错误
*. 502 命令不可实现
*. 503 错误的命令序列
*. 504 命令参数不可实现
*. 211 系统状态或系统帮助响应
*. 214 帮助信息
*. 220 服务就绪
*. 221 服务关闭传输信道
*. 421 服务未就绪,关闭传输信道(当必须关闭时,此应答可以作为对任何命令的响应)
*. 250 要求的邮件操作完成
*. 251 用户非本地,将转发向
*. 450 要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)
*. 550 要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)
*. 451 放弃要求的操作;处理过程中出错
*. 551 用户非本地,请尝试
*. 452 系统存储不足,要求的操作未执行
*. 552 过量的存储分配,要求的操作未执行
*. 553 邮箱名不可用,要求的操作未执行(例如邮箱格式错误)
*. 354 开始邮件输入,以.结束
*. 554 操作失败
*. 535 用户验证失败
*. 235 用户验证成功
*. 334 等待用户输入验证信息
每次客户端想服务器发一个指令过服务器便会返回相应的相应信息,信息格式为(响应码+空格+解释)
一些常见的相应码为:
简单的过程
1. 建立TCP 连接。
2. 客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令;服务器端正希望以OK作为响应,表明准备接收。
3. 客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行;服务器端则表示是否愿意为收件人接收邮件。
4. 协商结束,发送邮件,用命令DATA发送。
5. 以“.”号表示结束输入内容一起发送出去,结束此次发送,用QUIT命令退出。
客户端向邮件服务器发送的 常用指令
HELO hostname 与服务器打招呼并且告知服务器客户端使用的机器名,这里可以随便填写;
AUTH LOGIN:user,pass 邮箱帐号,密码
MAIL FROM:sender 告诉邮件服务器发信人的地址;
RCPT TO:receiver 告诉邮件服务器收信人的地址;
DATA 开始发送邮件内容,并且最后只能含有"."为结尾字符的行结束。
QUIT 传输结束,退出连接;
一个简单的例子
[php]
01. <?php
02. class aMail{
03. public static $smtp_prot = 25;
04. public static $debug = true;
05. public static $crlf = "\r\n" ;
06. var $smtp_host ;
07. var $login_name ;
08. var $password ;
09. var $form ;
10. var $to ;
11. var $err ;
12. var $message ;
13. var $socket ;
14. function __construct( $options = "" ){
15. if ( $options == "" || ! is_array ( $options )){
16. return false;
17. }
18. foreach ( $options as $key => $val ){
19. $this -> $key = $val ;
20. }
21. }
22.
23. function sendMail(){
24. $this ->socket = fsockopen ( $this ->smtp_host,self:: $smtp_prot );
25. $socket = $this ->socket;
26. $crlf = self:: $crlf ;
27. stream_set_blocking( $socket ,true);
28. $this ->message = fgets ( $socket ,512);
29. echo $this ->message;
30. if (! $this ->print_messsage( "/^220/" , "connect fail" )){
31. return false;
32. }
33.
34. fputs ( $socket , "EHLO 127.0.0.1" . $crlf );
35. $this ->message = fgets ( $socket , 512);
36. if (! $this ->print_messsage( "/^2/" , "EHLO fail" )){
37. return false;
38. }
39.
40. fputs ( $socket , "AUTH LOGIN" . $crlf );
41. $this ->message = fgets ( $socket , 512);
42. $this ->print_messsage( "/^2/" , "AUTH LOGIN fail" );
43.
44. fputs ( $socket , base64_encode ( $this ->login_name). $crlf );
45. $this ->message = fgets ( $socket , 512);
46. $this ->print_messsage( "/^2/" , "login_name fail" );
47.
48. fputs ( $socket , base64_encode ( $this ->password). $crlf );
49. $this ->message = fgets ( $socket , 512);
50. $this ->print_messsage( "/^2/" , "password fail" );
51.
52. fputs ( $socket , "MAIL FROM: <" . $this ->from. ">" . $crlf );
53. $this ->message = fgets ( $socket , 512);
54. $this ->print_messsage( "/^2/" , "from fail" );
55.
56. fputs ( $socket , "RCPT TO: <" . $this ->to. ">" . $crlf );
57. $this ->message = fgets ( $socket , 512);
58. $this ->print_messsage( "/^334|^2/" , "to fail" );
59.
60. fputs ( $socket , "DATA" . $crlf );
61. $this ->message = fgets ( $socket , 512);
62. $this ->print_messsage( "/^334|^2/" , "DATA fail" );
63.
64. $html = implode( "" , array (
65. "To: " . $this ->to. $crlf ,
66. "From: " . $this ->from. $crlf ,
67. "Subject: " . $this ->subject. $crlf . $crlf ,
68. $this ->content. $crlf . "." . $crlf ,
69. ));
70.
71. fputs ( $socket , $html );
72. $this ->message = fgets ( $socket , 512);
73. $this ->print_messsage( "/^2/" , "html fail" );
74.
75. fputs ( $socket , "QUIT" . $crlf );
76. $this ->message= fgets ( $socket ,512);
77. $this ->print_messsage( "/^2/" , "QUIT fail" );
78. }
79. function print_messsage( $reg = "" , $err = "" ){
80. $message = $this ->message;
81. if (preg_match( $reg , $message )<=0){
82. $this ->err = $err . "___" . $message . "--------------" ;
83. echo $err . "___" . $message . "--------------<br>" ;
84. return false;
85. }
86. if (self:: $debug ){
87. echo $this ->message. "<br>" ;
88. }
89. return true;
90. }
91. }
92. $mail_options = array (
93. "smtp_host" => "smtp.sina.com.cn" ,
94. "login_name" => "ycwtt0527" ,
95. "password" => "XXXXX" , //填写真实的密码的密码
96. "from" => "
ycwtt0527@sina.com" ,
97. "to" => "
ycwtt0527@sina.com" ,
98. "subject" => "hengheng" ,
99. "content" => "<div style='color:#f00'>asfsadfasdf</div><span>haha</span>" ,
100.
101. );
102.
103. $x = new aMail( $mail_options );
104. $x ->sendMail();
105. ?>
运行上面 在页面上会打印
220 irja2-171.sinamail.sina.com.cn ESMTP 220 irja2-171.sinamail.sina.com.cn ESMTP
250-irja2-171.sinamail.sina.com.cn
250-8BITMIME
250-SIZE 73400320
250-AUTH PLAIN LOGIN
250 AUTH=PLAIN LOGIN
334 VXNlcm5hbWU6
334 UGFzc3dvcmQ6
235 #2.0.0 OK Authenticated
250 sender ok
看到sender ok 算是发送成功了, 但是对方是否能收的到就不一定了........
发送的内容是<div style='color:#f00'>asfsadfasdf</div><span>haha</span>
发现在收邮件的时候这个标签被转义了,(如果发的是图片,我试了几次都收不到)
这是就要靠MIME扩展来解决这个问题了
大概看了2天相关的内容,结果完全晕了....
MIME的扩展 真心看不大懂 然后看了下phpmailer 就更晕了 光 content-type就有8bit ,7bit,text/plain,iso-8859-1,base64
然后发邮件又有个中参数 附件 图片 多媒体 等等 n多分枝(因为要根据设置了不同的参数来设置MIME头,在phpmailer里面有create_header,create_body 2个方法,对这边有比较多的判断,我是没兴趣看了)
想看 MIME部分 还是 去看 RFC文档 配合 phpmailer一起看可能效果好点
算了 放弃了 用phpmailer 发了封简单的邮件
看 怎么拼简单的html邮件
如下
To:
ycwtt0527@sina.comFrom: <
ycwtt0527@sina.com>
Subject: hengheng<br>
Return-Path:
ycwtt0527@sina.comMIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Content-Type: text/html; charset = "iso-8859-1"
<div>asdasdasdasdasdasd</div>
[php]
01. <?php
02. //RFC文档
03. class aMail{
04. public static $smtp_prot = 25;
05. public static $debug = true;
06. public static $crlf = "\r\n" ;
07. var $smtp_host ;
08. var $login_name ;
09. var $password ;
10. var $form ;
11. var $to ;
12. var $err ;
13. var $message ;
14. var $socket ;
15. public function __construct( $options = "" ){
16. if ( $options == "" || ! is_array ( $options )){
17. return false;
18. }
19. foreach ( $options as $key => $val ){
20. $this -> $key = $val ;
21. }
22. }
23.
24. public function sendMail(){
25. $this ->socket = fsockopen ( $this ->smtp_host,self:: $smtp_prot );
26. $socket = $this ->socket;
27. $crlf = self:: $crlf ;
28. stream_set_blocking( $socket ,true);
29. $this ->message = fgets ( $socket ,512);
30. echo $this ->message;
31. if (! $this ->print_messsage( "/^220/" , "connect fail" )){
32. return false;
33. }
34.
35. fputs ( $socket , "EHLO 127.0.0.1 " . $crlf );
36. $this ->message = fgets ( $socket , 512);
37. if (! $this ->print_messsage( "/^2/" , "EHLO fail" )){
38. return false;
39. }
40.
41. fputs ( $socket , "AUTH LOGIN" . $crlf );
42. $this ->message = fgets ( $socket , 512);
43. $this ->print_messsage( "/^2/" , "AUTH LOGIN fail" );
44.
45. fputs ( $socket , base64_encode ( $this ->login_name). $crlf );
46. $this ->message = fgets ( $socket , 512);
47. $this ->print_messsage( "/^2/" , "login_name fail" );
48.
49. fputs ( $socket , base64_encode ( $this ->password). $crlf );
50. $this ->message = fgets ( $socket , 512);
51. $this ->print_messsage( "/^2/" , "password fail" );
52.
53. fputs ( $socket , "MAIL FROM: <" . $this ->from. ">" . $crlf );
54. $this ->message = fgets ( $socket , 512);
55. $this ->print_messsage( "/^2/" , "from fail" );
56.
57. fputs ( $socket , "RCPT TO: <" . $this ->to. ">" . $crlf );
58. $this ->message = fgets ( $socket , 512);
59. $this ->print_messsage( "/^334|^2/" , "to fail" );
60.
61. fputs ( $socket , "DATA" . $crlf );
62. $this ->message = fgets ( $socket , 512);
63. $this ->print_messsage( "/^334|^2/" , "DATA fail" );
64.
65. $content = $this ->setHtmlBody();
66.
67. fputs ( $socket , $content );
68. $this ->message = fgets ( $socket , 512);
69. $this ->print_messsage( "/^2/" , "html fail" );
70.
71. fputs ( $socket , "QUIT" . $crlf );
72. $this ->message= fgets ( $socket ,512);
73. $this ->print_messsage( "/^2/" , "QUIT fail" );
74. }
75. public function print_messsage( $reg = "" , $err = "" ){
76. $message = $this ->message;
77. if (preg_match( $reg , $message )<=0){
78. $this ->err = $err . "___" . $message . "--------------" ;
79. echo $err . "___" . $message . "--------------<br>" ;
80. return false;
81. }
82. if (self:: $debug ){
83. echo $this ->message. "<br>" ;
84. }
85. return true;
86. }
87. public function setHtmlBody(){
88. $content = $this ->content;
89. $crlf = self:: $crlf ;
90. $header = array ();
91.
92. $uniq_id = md5(uniqid(time()));
93. $boundary1 = "b1_" . $uniq_id ;
94. $boundary2 = "b2_" . $uniq_id ;
95.
96. $header [] = "To: " . $this ->to. $crlf ;
97. $header [] = "From: <" . $this ->from. ">" . $crlf ;
98. $header [] = "Subject: " . $this ->subject. $crlf ;
99. $header [] = "Return-Path:" . $this ->from. $crlf ;
100. $header [] = "MIME-Version: 1.0" . $crlf ;
101. $header [] = "Content-Transfer-Encoding: 8bit" . $crlf ;
102. $header [] = "Content-Type: text/html; charset= \"iso-8859-1\"" . $crlf . $crlf ;
103. $content = str_replace ( "\r\n" , "\n" , $content );
104. $content = str_replace ( "\r" , "\n" , $content );
105. $content = str_replace ( "\n" , $crlf , $content );
106. $header [] = $content . $crlf . $crlf ;
107. $str = join( "" , $header );
108. $str .= $crlf . "." . $crlf ;
109. return $str ;
110. }
111. }
112. $mail_options = array (
113. "smtp_host" => "smtp.sina.com.cn" ,
114. "login_name" => "ycwtt0527" ,
115. "password" => "xxxxx" , //填写密码的
116. "from" => "
ycwtt0527@sina.com" ,
117. "to" => "
ycwtt0527@sina.com" ,
118. "subject" => "hengheng" ,
119. "content" => '<font size="7"><b>hello,world</b></font><br><font size="2">sdfsadasdf</font><br>' ,
120. );
121.
122. $x = new aMail( $mail_options );
123. $x ->sendMail();
124.
125. ?>