用Socket发送电子邮件2

来源:互联网 发布:什么叫网络电视 编辑:程序博客网 时间:2024/05/20 06:53
在编写socket处理部分发现,一些命令的处理很相似,如HELO,MAIL FROM,RCPT TO,QUIT,DATA命令,都要求根据是否显示调试信息将相关内容显示出来,同时对于返回的响应码,如果是期望的,则应继续处理,如果不是期望的,则应中断出理。所以为了清晰与简化,专门对这些命令的处理编写了一个通用处理函数。函数的参数中$code为期望的响应码,如果响应码与之相同则表示处理成功,否则出错。 

第3行,记录最后执行命令。 
第4行,将上传命令显示出来。 
第5行,则使用fputs真正向服务器传换指令。 
第6行,从服务器接收响应信息将放在最后响应消息变量中。 
第7行,将响应信息显示出来。 
第8行,判断响应信息是否期待的,如果是则第13行返回成功(true),否则在第10行返回失败(false)。 

  这样,这个函数一方面完成指令及信息的发送显示功能,别一方面对返回的响应判断是否成功。 

邮件发送处理 

  下面是真正的秘密了,可要看仔细了。:) 

--------------------------------------------------------------------- 

1 function send( $to,$from,$subject,$message) 
2 { 

4 //连接服务器 
5 $this->lastact="connect"; 

7 $this->show_debug("Connect to SMTP server : ".$this->smtp, "o 
ut"); 
8 $this->fp = fsockopen ( $this->smtp, $this->port ); 
9 if ( $this->fp ) 
10 { 
11 
12 set_socket_blocking( $this->fp, true ); 
13 $this->lastmessage=fgets($this->fp,512); 
14 $this->show_debug($this->lastmessage, "in"); 
15 
16 if (! ereg ( "^220", $this->lastmessage ) ) 
17 { 
18 return false; 
19 } 
20 else 
21 { 
22 $this->lastact="HELO " . $this->welcome . "n"; 
23 if(!$this->do_command($this->lastact, "250")) 
24 { 
25 fclose($this->fp); 
26 return false; 
27 } 
28 
29 $this->lastact="MAIL FROM: $from" . "n"; 
30 if(!$this->do_command($this->lastact, "250")) 
31 { 
32 fclose($this->fp); 
33 return false; 
34 } 
35 
36 $this->lastact="RCPT TO: $to" . "n"; 
37 if(!$this->do_command($this->lastact, "250")) 
38 { 
39 fclose($this->fp); 
40 return false; 
41 } 
42 
43 //发送正文 
44 $this->lastact="DATAn"; 
45 if(!$this->do_command($this->lastact, "354")) 
46 { 
47 fclose($this->fp); 
48 return false; 
49 } 
50 
51 //处理Subject头 
52 $head="Subject: $subjectn"; 
53 if(!empty($subject) && !ereg($head, $message)) 
54 { 
55 $message = $head.$message; 
56 } 
57 
58 //处理From头 
59 $head="From: $fromn"; 
60 if(!empty($from) && !ereg($head, $message)) 
61 { 
62 $message = $head.$message; 
63 } 
64 
65 //处理To头 
66 $head="To: $ton"; 
67 if(!empty($to) && !ereg($head, $message)) 
68 { 
69 $message = $head.$message; 
70 } 
71 
72 //加上结束串 
73 if(!ereg("n.n", $message)) 
74 $message .= "n.n"; 
75 $this->show_debug($message, "out"); 
76 fputs($this->fp, $message); 
77 
78 $this->lastact="QUITn"; 
79 if(!$this->do_command($this->lastact, "250")) 
80 { 
81 fclose($this->fp); 
82 return false; 
83 } 
84 } 
85 return true; 
86 } 
87 else 
88 { 
89 $this->show_debug("Connect failed!", "in"); 
90 return false; 
91 } 
92 } 
--------------------------------------------------------------------- 

  有些意思很清楚的我就不说了。 

  这个函数一共有四个参数,分别是$to表示收信人,$from表示发信人,$subject表求邮件主题和$message表示邮件体。如果处理成功则返回true,失败则返回false。 

第8行,连接邮件服务器,如果成功响应码应为220。 
第12行,设置阻塞模式,表示信息必须返回才能继续。详细说明看手册吧。 
第16行,判断响应码是否为220,如果是,则继续处理,否则出错返回。 
第22-27行,处理HELO指令,期望响应码为250。 
第29-34行,处理MAIL FROM指令,期望响应码为250。 
第36-41行,处理RCPT TO指令,期望响应码为250。 
第44-49行,处理DATA指令,期望响应码为354。 
第51-76行,生成邮件体,并发送。 
第52-56行,如果$subject不为空,则查找邮件体中是否有主题部分,如果没有,则加上主题部分。 
第59-63行,如果$from不为空,则查找邮件体中是否有发信人部分,如果没有,则加上发信人部分。 
第66-70行,如果$to不为空,则查找邮件体中是否有收信人部分,如果没有,则加上收信人部分。 
第73-74行,查找邮件体是否有了结束行,如果没有则加上邮件体的结束行(以"."作为单独的一行的特殊行)。 
第76行,发送邮件体。 
第78-83行,执行QUIT结否与服务器的连接,期望响应码为250。 
第85行,返回处理成功标志(true)。 
第81-91行,与服务器连接失败的处理。 

  以上为整个send_mail类的实现,应该不是很难的。下面给出一个实例。 

邮件发送实例 
  先给出一个最简单的实例: 
--------------------------------------------------------------------- 

1 include "sendmail.class.php3"; 
2 $email="Hello, this is a test letter!"; 
3 $sendmail=new send_mail("smtp.263.net", "limodou", true); //显示调 
示信息 
4 if($sendmail->send("chatme@263.net", "chatme@263.net", "test", $e 
mail)) 
5 { 
6 echo "发送成功!
"; 
7 } 
8 else 
9 { 
10 echo "发送失败!
"; 
11 } 
?> 
--------------------------------------------------------------------- 

第1行,装入send_mail类。 
第3行,创建一个类的实例,且设置显示调示信息,如果不想显示,可以$sendmail=new send_mail("smtp.263.net");。 
第4行,发送邮件。 

很简单,不是吗?下面再给合以前的发送MIME邮件的例子,给出一个发送HTML附件的例子。 

--------------------------------------------------------------------- 


include "MIME.class.php3"; 
//注,在发送MIME邮件一文中,这个类文件名为MIME.class,在此处我改成这样的 

$to = 'chatme@263.net'; //改为收信人的邮箱 
$str = "Newsletter for ".date('M Y', time()); 

//信息被我改少了 
$html_data = ' 

Hello! This is a test! 

'; 

//生成MIME类实例 
$mime = new MIME_mail("chatme@263.net", $to, $str); 

//添加HTML附件 
$mime->attach($html_data, "", HTML, BASE64); 

//注释掉,采用我的发送邮件处理 
//$mime->send_mail(); 

//生成邮件 
$mime->gen_email(); 

//显示邮件信息 
//echo $mime->email."
"; 

//包含sendmail文件 
include "sendmail.class.php3"; 

//创建实例 
$sendmail=new send_mail("smtp.263.net", "limodou", true); 


//发送邮件 
$sendmail->send("chatme@263.net", "chatme@263.net", $str, $mime->e 
mail); 

?> 
--------------------------------------------------------------------- 

  注释写的很清楚,就不再做更多的解释了。如果实际应用中,请将send_mail构造函数中的debug设为false或不写即可。在此处可以下载关于本文的例子。2 
000082201.zip [http://www.phprecord.com/docs/2000082201.zip]
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电动车刹车油泵不打油怎么办 cad转pdf颜色浅怎么办 松下多功能传真一体机卡纸怎么办 无刷电机坏了怎么办 6kv高压电机绝缘不合格怎么办? 400t油压机下降太慢怎么办 无法连线到服务器1~1怎么办? 数控车床车角度不亮怎么办 超市存包柜的票不见了怎么办 交货期来不及导致船期延误怎么办 跑1000米中途累怎么办 手指被机器压烂怎么办 机械手不能回归原点该怎么办 前缘送纸纸板翘怎么办 三菱AL 1R.2报警怎么办 工作好但领导不好伺候怎么办 孕妇憋尿憋的小腹疼怎么办 怀孕憋尿憋的小腹疼怎么办 半夜憋尿憋的小腹疼怎么办 新生儿大便次数较多怎么办 母猎生下三天没有奶怎么办 孩孑大便干不爱喝水怎么办 发那科1050报警怎么办 plc模块bf亮了怎么办 plc模块df亮了怎么办 西门子触摸屏进不了主画面怎么办 pos机显示白屏怎么办 洗衣机的门坏了怎么办 西门子洗衣机门坏了怎么办 拆线线断在肉里怎么办 总线绝对值编码器方向反了怎么办 台达伺服报警009怎么办 台达plc禁止上传怎么办? 潜水泵电机启动绕组断线了怎么办? 永磁电机磁没了怎么办 热水器热水管坏了怎么办 松下伺服驱动器坏了怎么办 步进电机功率小了怎么办 电三轮电机坏了怎么办 电动车钢圈撞变形了怎么办 电动车后轮钢圈变形了怎么办