网络课设.docx

上传人:b****5 文档编号:11988377 上传时间:2023-04-16 格式:DOCX 页数:28 大小:308.14KB
下载 相关 举报
网络课设.docx_第1页
第1页 / 共28页
网络课设.docx_第2页
第2页 / 共28页
网络课设.docx_第3页
第3页 / 共28页
网络课设.docx_第4页
第4页 / 共28页
网络课设.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

网络课设.docx

《网络课设.docx》由会员分享,可在线阅读,更多相关《网络课设.docx(28页珍藏版)》请在冰豆网上搜索。

网络课设.docx

网络课设

网络课程设计实验报告

利用Socket编程实现邮件发送服务器

 

学号:

4090511

姓名:

唐盼

日期:

2012-06-29

成绩:

 

东北大学秦皇岛分校

一,实验目的

实现简单的邮件服务器,利用Socket编程实现邮件服务器.通过任选一门自己熟悉的程序设计语言,根据SMTP实现一个简单的邮件服务器.熟悉Socket套接字的在具体程序语言中的使用和SMTP协议的运用和实现.掌握SMTP协议的基本原理和Socket的使用.

二,实验步骤

首先我个人对PHP语言比较熟悉,所以选择PHP程序语言实现此次课程设计.然后利用以前做过的一些小练习,在以前网络课的学习基础上,通过查阅网上的资料.基本确定STMP协议发送邮件服务器的实现过程.(在电脑里安装服务器,以及搭建php环境这里就不再累述.因为网络编程,主要叙述SMTP协议和Socket套接字的运用.)

1.搭建php+apache服务器环境.搭建一个php环境.

2.登录界面.对用户的对用户合法性进行判断.只有匹配成功,才能登录邮件服务器进行发送邮件.否则不能登录.

3.实现Socket的编程,利用SMTP协议,进行邮件发送.从而实现邮件发送服务器.

SMTP协议:

简单邮件传输协议.即是邮件发送时使用的协议.

邮件发送实物原理图.

由上图可以看出,邮件发送,并不是直接发给对方的邮箱.而是通过自己的邮件端的服务器,然后再转发到对方邮箱所在的服务器.之间的发送就是遵守的SMTP协议.我们从客户代理将邮件发送到发送放邮件服务器时,使用的是SMTP协议,发送方邮件服务器讲邮件发送到接收方邮件服务器时,使用的也是SMTP协议。

当接收方代理从接收方邮件服务器获得邮件时,使用的是POP3协议,总之,发送使用SMTP协议,接收使用POP3协议。

而我们这里要做的是利用socket发送邮件,实质上就是自己编写代码取代发送方邮件代理的功能,自己将邮件发送到发送方邮件服务器中.我们在编写的代码就是如何实现SMTP。

因此我们只是关心如何发送邮件,而不需要关心接收方如何获得邮件.

首先在php中,使用fsockopen函数打开一个网络连接,函数语法格式:

intfsockopen(stringhostname,intport,int[errno],string[errstr],int[timeout]);这里由于要使用SMTP协议,所以端口号为25。

在打开连接成功后,会返回一个socket句柄,使用它就可以象使用文件句柄一样的。

可使用的操作有fputs(),fgets(),feof(),fclose()

SMTP分为命令头和信息体两部分。

命令头主要完成客户端和服务器的连接,验证等。

整个过程由多条命令组成。

每个命令发送到服务器后,由服务器给出相应信息,一般为3位数字的响应码和响应文本。

不同的服务器返回的响应码是遵守协议的,但是响应正文本则不必。

每个命令及响应的最后都有一个回车符,这样使用fputs和fgets就可以进行响应的处理.SMTP的命令及响应信息都是单行的。

信息体则是邮件的正文部分,最后的结束行应以单独的"."作为结束行.

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

HELOhostname:

与服务器打招呼并告知客户端使用的机器名字,可以随便填写

MAILFROM:

sender_id:

告诉服务器发信人的地址

RCPTTO:

receiver_id:

告诉服务器收信人的地址

DATA:

下面开始传输信件内容,且最后要以只含有.的特殊行结束

RESET:

取消刚才的指令,从新开始

VERIFYuserid:

校验帐号是否存在(此指令为可选指令,服务器可能不支持)

QUIT:

退出连接,结束

客户端每发一条命令,服务器便会返回相应的相应信息,信息格式为(响应码+空格+解释)一些常见的相应码为:

220服务就绪(在socket连接成功时,会返回此信息)

221正在处理

250请求邮件动作正确,完成(HELO,MAILFROM,RCPTTO,QUIT指令执行成功会返回此信息)

354开始发送数据,结束以.(DATA指令执行成功会返回此信息,客户端应发送信息)

500语法错误,命令不能识别

550命令不能执行,邮箱无效

552中断处理:

用户超出文件空间

三,实验过程和代码

一简单的登录界面,用html语言解决.

功夫熊猫邮箱

15px">

--占位表格-->

--利用表格布局共8行2列-->

用户名:

密码:

1.登录界面

二操作主页面的实现代码如下:

主页面代码main.html

熊猫在线

--顶部框架-->

--中间两个框架-->

2px">

--底部两个框架-->

top.html代码

熊猫邮件在线

0px;font-size=15px">

欢迎使用功夫熊猫邮件在线系统

Midleft.html代码

熊猫在线

邮箱主页

写信件

收件箱

Midright.html代码

欢迎使用熊猫邮箱系统!

!


写邮件

Btnleft.html代码

唐盼是一个好学生!

!

Btnright.html代码

15px">

熊猫在线

版权所有

C

4090511唐盼

2.操作主页面

Sendmail.html代码

写信件

发件人:


收件人:


主题:



2.发送邮件的操作界面

三实现smtp的Socket套接字代码,也是此次试验的关键代码

Send.class.php代码

php

define('SMTP_STATUS_NOT_CONNECTED',1,TRUE);

define('SMTP_STATUS_CONNECTED',2,TRUE);

error_reporting(E_ALL&~E_NOTICE);

/**

*@descSMTP邮件服务器

*@param服务器参数和邮件信息

*@author唐盼

*@date2012062722:

17:

14

*@contactQQ:

397306887

*/

classp8_smtp

{

var$connection;

var$recipients;

var$headers;

var$timeout;

var$errors;

var$status;

var$body;

var$from;

var$host;

var$port;

var$helo;

var$auth;

var$user;

var$pass;

/**

*参数为一个数组

*hostSMTP服务器的主机默认:

localhost

*portSMTP服务器的端口默认:

25

*helo发送HELO命令的名称默认:

localhost

*userSMTP服务器的用户名默认:

空值

*passSMTP服务器的登陆密码默认:

空值

*timeout连接超时的时间默认:

5

*@returnbool

*/

functionp8_smtp($params=array())

{

if(!

defined('CRLF'))define('CRLF',"\r\n",TRUE);

$this->timeout=5;

$this->status=SMTP_STATUS_NOT_CONNECTED;

$this->host='localhost';

$this->port=25;

$this->auth=FALSE;

$this->user='';

$this->pass='';

$this->errors=array();

foreach($paramsas$key=>$value)

{

$this->$key=$value;

}

$this->helo=$this->host;

//如果没有设置用户名则不验证

$this->auth=(''==$this->user)?

FALSE:

TRUE;

}

functionconnect($params=array())

{

if(!

isset($this->status))

{

$obj=newp8_smtp($params);

if($obj->connect())

{

$obj->status=SMTP_STATUS_CONNECTED;

}

return$obj;

}

else

{

$this->connection=fsockopen($this->host,$this->port,$errno,$errstr,$this->timeout);

socket_set_timeout($this->connection,0,250000);

$greeting=$this->get_data();

if(is_resource($this->connection))

{

$this->status=2;

return$this->auth?

$this->ehlo():

$this->helo();

}

else

{

$this->errors[]='Failedtoconnecttoserver:

'.$errstr;

returnFALSE;

}

}

}

/**

*参数为数组

*recipients接收人的数组

*from发件人的地址,也将作为回复地址

*headers头部信息的数组

*body邮件的主体

*/

functionsend($params=array())

{

foreach($paramsas$key=>$value)

{

$this->set($key,$value);

}

if($this->is_connected())

{

//服务器是否需要验证

if($this->auth)

{

if(!

$this->auth())returnFALSE;

}

$this->mail($this->from);

if(is_array($this->recipients))

{

foreach($this->recipientsas$value)

{

$this->rcpt($value);

}

}

else

{

$this->rcpt($this->recipients);

}

if(!

$this->data())returnFALSE;

$headers=str_replace(CRLF.'.',CRLF.'..',trim(implode(CRLF,$this->headers)));

$body=str_replace(CRLF.'.',CRLF.'..',$this->body);

$body=$body[0]=='.'?

'.'.$body:

$body;

$this->send_data($headers);

$this->send_data('');

$this->send_data($body);

$this->send_data('.');

return(substr(trim($this->get_data()),0,3)==='250');

}

else

{

$this->errors[]='Notconnected!

';

returnFALSE;

}

}

functionhelo()

{

if(is_resource($this->connection)

AND$this->send_data('HELO'.$this->helo)

ANDsubstr(trim($error=$this->get_data()),0,3)==='250')

{

returnTRUE;

}

else

{

$this->errors[]='HELOcommandfailed,output:

'.trim(substr(trim($error),3));

returnFALSE;

}

}

functionehlo()

{

if(is_resource($this->connection)

AND$this->send_data('EHLO'.$this->helo)

ANDsubstr(trim($error=$this->get_data()),0,3)==='250')

{

returnTRUE;

}

else

{

$this->errors[]='EHLOcommandfailed,output:

'.trim(substr(trim($error),3));

returnFALSE;

}

}

functionauth()

{

if(is_resource($this->connection)

AND$this->send_data('AUTHLOGIN')

ANDsubstr(trim($error=$this->get_data()),0,3)==='334'

AND$this->send_data(base64_encode($this->user))//Sendusername

ANDsubstr(trim($error=$this->get_data()),0,3)==='334'

AND$this->send_data(base64_encode($this->pass))//Sendpassword

ANDsubstr(trim($error=$this->get_data()),0,3)==='235')

{

returnTRUE;

}

else

{

$this->errors[]='AUTHcommandfailed:

'.trim(substr(trim($error),3));

returnFALSE;

}

}

functionmail($from)

{

if($this->is_connected()

AND$this->send_data('MAILFROM:

<'.$from.'>')

ANDsubstr(trim($this->get_data()),0,2)==='250')

{

returnTRUE;

}

else

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1