仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2602|回复: 20

[学习教程] PHP编程:PHP顶用Socket发送电子邮件(1)

[复制链接]
活着的死人 该用户已被删除
发表于 2015-2-16 00:26:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
第1步环境配置好了,你算了进了1小步了,那么第2步呢 就是调出第1个程序 一般都是用hello world,视频教程里面我都做了,hello world   


Socket编程引见
  

  利用fsockopen函数翻开一个Internet毗连,函数语法格局:

int fsockopen(string hostname, int port, int [errno], string [errstr], int [timeout]);

  参数的意思我想不必讲了,这里因为要利用SMTP协定,所以端标语为25。在翻开毗连胜利后,会前往一
个socket句柄,利用它就能够象利用文件句柄一样的。可以使用的操作有fputs(),fgets(),feof(),fclose()
等。

  很复杂地引见就到这里吧。

SMTP的基本
  基于TCP/IP的因特网协定普通的号令格局都是经由过程恳求/ 应对体例完成的,采取的都是文本信息,所以
处置起来要轻易一些。SMTP是复杂邮件传输协定的简称,它可以完成客户端向办事器发送邮件的功效。所以
上面所讲的号令是指客户端向办事器收回恳求指令,而呼应则是指办事器前往给客户真个信息。

  SMTP分为号令头和信息体两局部。号令头次要完成客户端与办事器的毗连,验证等。全部进程由多条命
令构成。每一个号令发到办事器后,由办事器给出呼应信息,通常是3 位数字的呼应码和呼应文本。分歧的服
务器前往的呼应码是恪守协定的,然而呼应注释本则不用。每一个号令及呼应的最初都有一个回车符,如许使
用fputs()和fgets()就能够停止号令与呼应的处置了。SMTP的号令及呼应信息都是单行的。信息体蚴怯始?
的注释局部,最初的停止行应以独自的"."作为停止行。

  客户端一些经常使用的SMTP指令为:

HELO hostname: 与办事器打召唤并告诉客户端利用的机械名字,可以随意填写
MAIL FROM: sender_id : 告知办事器发信人的地址
RCPT TO: receiver_id : 告知办事器收信人的地址
DATA : 上面入手下手传输函件内容,且最初要以只含有.的特别行停止
RESET: 作废方才的指令,重新入手下手
VERIFY userid: 校验帐号是不是存在(此指令为可选指令,办事器能够不撑持)
QUIT : 加入毗连,停止
  办事器前往的呼应信息为(格局为:呼应码+空格+注释):

220 办事停当(在socket毗连胜利时,会前往此信息)
221 正在处置
250 恳求邮件举措准确,完成(HELO,MAIL FROM,RCPT TO,QUIT指令履行胜利会前往此信息)
354 入手下手发送数据,停止以 .(DATA指令履行胜利会前往此信息,客户端应发送信息)
500 语法毛病,号令不克不及辨认
550 号令不克不及履行,邮箱有效
552 中止处置:用户超越文件空间
  上面给出一个复杂的号令头(这是在翻开socket以后做的),是我向stmp.263.net发邮件的测试了局:

HELO limodou
250 smtp.263.net
MAIL FROM: chatme@263.net
250 Ok
RCPT TO: chatme@263.net
250 Ok
DATA
354 End data with .
To: chatme@263.net
From: chatme@263.net
Subject: test
From: chatme@263.net
test
.
QUIT
250 Ok: queued as C46411C5097E0

  这就是一些SMTP的复杂常识。相干内容可以查阅RFC。

RFC 821界说了收/发电子邮件的相干指令。
RFC 822则制订了邮件热莸母袷健
RFC 2045-2048制订了多媒体邮件热莸母袷剑
RFC 1113, 1422-1424则是会商若何促进电子邮件的保密性。

send_mail类的完成
  如今入手下手引见我所编写的发送邮件类。有了下面的准备常识了,上面就是完成了。

类的成员变量

var $lastmessage; //纪录最初前往的呼应信息
var $lastact; //最初的举措,字符串模式
var $welcome; //用在HELO前面,接待用户
var $debug; //是不是显示调试信息
var $smtp; //smtp办事器
var $port; //smtp端标语
var $fp; //socket句柄

  个中,$lastmessage和$lastact用于纪录最初一次呼应信息及履行的号令,当失足时,用户可使用它
们。为了测试需求,我还界说了$debug变量,当其值为true时,会在运转过程当中显示一些履行信息,不然无
任何输入。$fp用于保留翻开后的socket句柄。

类的机关


--------------------------------------------------------------------------------
function send_mail($smtp, $welcome="", $debug=false)
{
if(empty($smtp)) die("SMTP cannt be NULL!");
$this->smtp=$smtp;
if(empty($welcome))
{
$this->welcome=gethostbyaddr("localhost");
}
else
$this->welcome=$welcome;
$this->debug=$debug;
$this->lastmessage="";
$this->lastact="";
$this->port="25";
}
--------------------------------------------------------------------------------
  这个机关函数次要完成一些初始值的剖断及设置。$welcome用于HELO指令中,告知办事器用户的名字。
HELO指令请求为机械名,然而不必也能够。假如用户没有给出$welcome,则主动查找当地的机械名。

显示调试信息

--------------------------------------------------------------------------------
1 function show_debug($message, $inout)
2 {
3 if ($this->debug)
4 {
5 if($inout=="in") //呼应信息
6 {
7 $m='<< ';
8 }
9 else
10 $m='>> ';
11 if(!ereg("\n$", $message))
12 $message .= "<br>";
13 $message=nl2br($message);
14 echo "<font color=#999999>${m}${message}</font>";
15 }
16 }
--------------------------------------------------------------------------------
  这个函数用来显示调试信息。可以在$inout中指定是上传的指令仍是前往的呼应,假如为上传指令,则
利用"out";假如为前往的呼应则利用"in"。

第3行,判别是不是要输入调试信息。
第5行,判别是不是为呼应信息,假如是,则在第7即将信息的后面加上"<< "来区分信息;不然在第10行加上
    ">> "来区分上传指令。
第11-12行,判别信息串最初是不是为换行符,如不是则加上HTML换行标志。第13即将所以的换行符转成HTML

从刚开始练习的PHP基础语法练习,到PHP语言在WEB中的应用,再到实际的项目开发,如留言版,相册系统,中小型公司网站系统,以及期间做过的有关团队合作的小游戏,让我受益匪浅,学到了很多。
admin 该用户已被删除
发表于 2015-2-16 02:26:02 | 显示全部楼层
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
乐观 该用户已被删除
发表于 2015-2-28 12:13:47 | 显示全部楼层
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
只想知道 该用户已被删除
发表于 2015-3-3 03:10:13 | 显示全部楼层
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
愤怒的大鸟 该用户已被删除
发表于 2015-3-4 07:26:24 | 显示全部楼层
实践是检验自己会不会的真理。
简单生活 该用户已被删除
发表于 2015-3-11 17:53:57 | 显示全部楼层
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
分手快乐 该用户已被删除
发表于 2015-3-19 04:54:09 | 显示全部楼层
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
蒙在股里 该用户已被删除
发表于 2015-3-22 18:45:28 | 显示全部楼层
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
深爱那片海 该用户已被删除
发表于 2015-4-21 20:49:49 | 显示全部楼层
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
山那边是海 该用户已被删除
发表于 2015-4-22 05:11:08 | 显示全部楼层
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
小妖女 该用户已被删除
发表于 2015-4-27 20:41:11 | 显示全部楼层
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
飘灵儿 该用户已被删除
发表于 2015-4-30 14:09:22 | 显示全部楼层
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
变相怪杰 该用户已被删除
发表于 2015-5-6 21:12:02 | 显示全部楼层
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
冷月葬花魂 该用户已被删除
发表于 2015-5-8 13:29:27 | 显示全部楼层
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
若相依 该用户已被删除
发表于 2015-5-11 03:48:04 | 显示全部楼层
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
第二个灵魂 该用户已被删除
发表于 2015-5-12 08:30:54 | 显示全部楼层
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
不帅 该用户已被删除
发表于 2015-6-4 00:24:52 | 显示全部楼层
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
小女巫 该用户已被删除
发表于 2015-6-6 03:26:02 | 显示全部楼层
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
再现理想 该用户已被删除
发表于 2015-6-14 11:53:05 | 显示全部楼层
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
柔情似水 该用户已被删除
发表于 2015-6-16 09:48:04 | 显示全部楼层
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-4-18 21:41

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表