关于电子邮件系统


关于电子邮件系统

电子邮件系统一般要实现以下功能:

1 用户申请注册功能。用户通过申请可以得到一个自己命名的信箱,容量大小为10M

2 用户忘记密码处理功能。用户忘记密码可以通过注册时设置的密码提示问题来重设密码。

3 用户收邮件功能。它包括SMTP收邮件、POP3取邮件和WWW读邮件三种方式。

4 用户发邮件功能。它包括SMTP发邮件、WWW直接发送邮件、暗送邮件、抄送邮件、定时发送邮件。

5 用户信件处理功能。系统初始设置4个文件夹来分类处理信件:收件箱、发件箱、草稿箱和垃圾箱。用户还可以自己建立新的文件夹。信件在各个信箱之间可以相互移动。

6 用户查找功能。用户可以使用查找功能通过查找信件主题或信件内容来找到自己需要的信件。

7 用户信箱配置设置。它包括个人资料更改、密码更改、参数设置、POP3服务器设置、过滤器设置、自动转信、定时发信、签名设置。

8 管理员管理用户和信箱邮件功能。包括输入(增删改)、查询、统计、报表。系统性能参数设置。

9 广播功能。它用于公司定期向一定的用户发送信息,由于一般的用户数有一定数量,所以必须用数据库管。

有几种方法可以构造电子邮件系统的内壳:共享文件系统的策略,基于局域网的专用协议,X.400P7协议和因特网消息存取协议。而基于INTERNET的协议主要有: POP (Post Office Protocol), DMSP (Distributed Mail System Protocol), IMAP (Internet Message Access Protocol).POP是最原始,最为人们所知的一种。DMSP仅局限于一个简单应用——PCMAIL,它的优点主要在于对脱机状态操作的支持。

 

SMTP协议原始命令码和工作原理

SMTP协议原始命令码和工作原理:

1.SMTP是工作在两种情况下:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器
2.SMTP
是个请求/响应协议,命令和响应都是基于ASCII文本,并以CRLF符结束。响应包括一个表示返回状态的三位数字代码

3.SMTP
TCP协议25号端口监听连接请求

4.
连接和发送过程:

a.
建立TCP连接

b.
客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令

服务器端正希望以OK作为响应,表明准备接收

c.
客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT

服务器端则表示是否愿意为收件人接受邮件

d.
协商结束,发送邮件,用命令DATA发送

e.
.表示结束输入内容一起发送出去

f.
结束此次发送,用QUIT命令退出。

5.
邮件路由过程:

SMTP
服务器基于域名服务DNS中计划收件人的域名来路由电子邮件。SMTP服务器基于DNS中的MX记录来路由电子邮件,MX记录注册了域名和相关的SMTP中继主机,属于该域的电子邮件都应向该主机发送。

 

 

c#下发送邮件:

主要用:

MailAttachment 提供用于构造电子邮件附件的属性和方法。

        MailMessage   提供用于构造电子邮件属性和方法。

SmtpMail        提供用于Windows2000 协作数据对象(cdosys)消息组件来发送消息的属性和方法。

枚举 MailCoding  提供电子邮件编码的枚举值

枚举 MailFormat  提供电子邮件格式的枚举值

枚举 MailPriority  提供电子邮件优先级的枚举值

// 下面是发送的主要代码

       public void click(object sender,System.EventArgs e)

         {

              MailMessage mailObj   = new MailMessage();

//发送者地址          

              mailObj.From = mailfrom.Text;

//目的地地址

              mailObj.To = mailto.Text;

//发送的标题

              mailObj.Subject = mailsubject1.Text;

//发送的内容          

mailObj.Body = mailobj.Text;         

//发送的优先级                  

              mailObj.Priority = MailPriority.High;

              Label9.Text = RadioButtonList1.SelectedValue;

//发送的格式

              if(RadioButtonList1.SelectedValue==”html”)

              {

                   mailObj.BodyFormat = MailFormat.Html;

              }

              else if(RadioButtonList1.SelectedValue==”text”)

              {

                   mailObj.BodyFormat = MailFormat.Text;

              }

     //发送文件

              if(inputMailAttachment.PostedFile.ContentLength>0)

              {

     mailObj.Attachments.Add(new MailAttachment(inputMailAttachment.PostedFile.FileName));

              }

 

              SmtpMail.Send(mailObj);

         }

 

Visual Stdio.Net下发送成功.

 

 

C#接受邮件:

主要用到了两个类:TcpClient类和NetworkStream类。

  • TcpClient类是运用C#进行网络编程的一个非常重要的类,它提供了通过网络连接、发送和接收数据的简单方法,从而实现了网络编程的大大简化。TcpClient 类提供了一些简单的方法,用于在同步阻塞模式下通过网络来连接、发送和接收流数据。使 TcpClient 连接并交换数据,使用 TCP ProtocolType 创建的 TcpListener Socket 必须侦听是否有传入的连接请求。可以使用下面两种方法之一连接到该侦听器:创建一个 TcpClient,并调用三个可用的 Connect 方法之一。
  • 使用远程主机的主机名和端口号创建 TcpClient。此构造函数将自动尝试一个连接。

注意   如果要在同步阻塞模式下发送无连接数据报,请使用 UdpClient 类。

对继承者的说明 要发送和接收数据,请使用 GetStream 方法来获取一个 NetworkStream。调用 NetworkStream 的 Write 和 Read 方法与远程主机之间发送和接收数据。使用 Close 方法释放与 TcpClient 关联的所有资源。

 

NetworkStream类实现通过网络套接字发送和接收数据的标准.Net框架流机制,它支持对网络数据流的同步和异步访问,是实现网络通讯的重要组成部分。NetworkStream 类提供在阻塞模式下通过 Stream 套接字发送和接收数据的方法。您可以使用 NetworkStream 类进行同步和异步数据传输。要创建 NetworkStream,必须提供连接的 Socket。也可指定 NetworkStream 对所提供的 Socket 具有哪些 FileAccess 权限。默认情况下,关闭 NetworkStream 并不会关闭所提供的 Socket。将 Write Read 方法用于简单的单线程同步阻塞 I/O。若要使用不同的线程来处理 I/O,则请考虑使用 BeginWrite/ EndWrite BeginRead/ EndRead 方法进行通信。

NetworkStream 不支持对网络数据流的随机访问。CanSeek 属性用于指示流是否支持查找,它的值始终为 false。读取 Position 属性、读取 Length 属性或者调用 Seek 方法都会引发 NotSupportedException。

 

 

/////消息响应函数完成了到POP3服务器的连接工作,并根据用户名和密码进行登录

//用110端口新建POP3服务器连接

 

Server = new TcpClient(PopServer.Text,110);

Status.Items.Clear();

Try
{
//初始化
NetStrm = Server.GetStream();
RdStrm= new StreamReader(Server.GetStream());
Status.Items.Add(RdStrm.ReadLine());
//登录服务器过程
Data = “USER “+ Username.Text+CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());
Data = “PASS “+ Password.Text+CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());
//向服务器发送STAT命令,从而取得邮箱的相关信息:邮件数量和大小
Data = “STAT”+CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());
}
catch(InvalidOperationException err)
{  
Status.Items.Add(“Error: “+err.ToString());
}
}

 

C#访问Hotmail

Hotmail是世界上影响最广的Web邮件系统,遗憾的是,当我们要为Hotmail编写独立的客户程序(不通过浏览器访问的客户程序)时,马上就会遇到Hotmail不提供POP网关这一障碍。
 
  Hotmail信箱默认的HTTPMail网关在http://services.msn.com/svcs/hotmail/httpmail.aspHTTPMail协议实际上是一个标准的WebDAV服务,只不过尚未公开而已。在编写C#程序时,我们可以方便地调用.NET框架在System.Net名称空间中提供的各个TCPHTTP类。另外,由于我们要操作WebDAV,在C#环境下利用XMLHTTP连接Hotmail最为简便,只需引用一下MSXML2组件就可以直接访问。