代码改变世界

邮件发送的原理

2012-04-17 08:22 by 左眼微笑右眼泪, ... 阅读, ... 评论, 收藏, 编辑

      最近看了一下邮件发送的相关原理,在网上找了一些资料,基本弄清楚了基本流程,在这里记录一下,欢迎大家拍砖。

 

概述

     电子邮件是因特网上使用得非常多的一种应用,它可以非常方便的使相隔很远的人进行通信。它主要的特点就是操作简单,快捷。当你发送一封邮件的时候,它首先会发送到收件人的邮件服务器上,并放入收件人的信箱中。(如果你在某一个邮件服务器提供商那里申请了一个邮箱账号,那么你在这个邮件服务器上面就有一个电子信箱)。收件人只需要定时读取它的电子信箱,就可以接收别人发送过来的信件,并与别人进行通信了。

 

基本组成部分:

      一个简单的邮件系统,应该包含三部分:首先是邮件服务器,然后是用户代理和邮件传送协议。 

    邮件服务器就是一个供在网上存储邮件的空间。一般每个邮件服务器的提供商都有自己的邮件服务器,只要你申请了他的邮箱账号,你就会在他的邮件服务器上拥有自己邮箱。像Google,腾讯都是邮件服务的提供商,他们都有自己的邮件服务器,如果你申请了Gamil邮箱,那么在Google的邮件服务器上面,你就有自己的一块存储空间了。同样,如果你申请了qq邮箱,那么在qq邮件服务器上面也有你自己的空间了,也就是你的邮箱。当你要收取信件的时候,你就需要连接到不同的服务器上面。不同的邮件服务提供商,他们的邮件服务器的地址是不一样的。后面会介绍一些常用的邮件服务器的地址。

     用户代理也就是你用来从邮件服务器上读取或者发送邮件到邮件服务器上的一个软件。比如常用的OutLook,Foxmail等等。我们知道,我们的邮件都是存储在邮件服务器上面的,我们发送邮件的时候,去往邮件服务器上面发,我们收取邮件的时候,也需要从服务器上面读。为了方便的完成这些工作,我们就需要用户代理。

      邮件传送协议是指邮件在传送过程中必须遵守的约定,它规定了不同的服务器(或客户端)之间应如何交换信息。比较常见的有邮件服务器之间的通信协议SMTP以及用户代理与邮件服务器之间的通信协议POP3。(注意:邮件服务器之间的协议是使用SMTP,用户发送邮件到邮件服务器使用的还是SMTP协议,用户从邮件服务器读取邮件用的才是POP3协议)。

 

基本流程:

image

截图来自谢希仁《计算机网络》

      邮件的收发过程:

1. 发信人在用户代理上编辑邮件,并写清楚收件人的邮箱地址;

2. 用户代理根据发信人编辑的信息,生成一封符合邮件格式的邮件;

3. 用户代理把邮件发送到发信人的的邮件服务器上,邮件服务器上面有一个缓冲队列,发送到邮件服务器上面的邮件都会加入到缓冲队列中,等待邮件服务器上的SMTP客户端进行发送;

4. 发信人的邮件服务器使用SMTP协议把这封邮件发送到收件人的邮件服务器上(它会自动根据收件人的邮箱来分析出收件人的邮箱服务器);

5. 收件人的邮件服务器收到邮件后,把这封邮件放到收件人在这个服务器上的信箱中;

6. 收件人使用用户代理来收取邮件。首先用户代理使用POP3协议来连接收件人所在的邮件服务器,身份验证成功后,用户代理就可以把邮件服务器上面的收件人邮箱里面的邮件读取出来,并展示给收件人。

    下面以一个简短的例子来说明这个过程:

     比如Tom要给Lucy发一封邮件,邀请她明天晚上一起看电脑。首先TOM会打开OutLook(用户代理),第一次使用用户代理时,需要进行相关的配置,详细的配置过程见后面的例子。我们先假设Tom已经配置好用户代理.Tom打开OutLook后,首先会填写收件人的邮箱,然后是邮件的主题以及邮件的内容,写好之后,点击发送。OutLook就会把这封邮件发送到Tom邮箱的服务器上面(比如Tom申请的是Gmail邮箱,那么这封邮件就会发送到Gmail的邮件服务器上面,这个邮件服务器的地址一般会由邮件服务商给出,在第一次配置OutLook时,就需要填写这个地址)。Tom邮箱服务器上面的SMTP客户端就根据收件人的地址,找到收件人所在的邮箱服务器,然后与收件人邮件服务器上面的SMTP端建立一个TCP连接,经过三次握手后,这封邮件就会通过这个连接传送到收件人的邮件服务器上面,也就是Lucy的邮箱服务器上面。如果Lucy需要收取邮件,它也需要一个用户代理,就假设她用的也是OutLook(她在第一次使用OutLook时,也要配置她的邮箱服务器地址),启动OutLook后,OutLook会每隔一段时间(这个时间可以由用户自己设置)去连接邮箱服务器,判断是否收到新的邮件,如果收到了新的邮件,就使用POP3协议把这封邮件读取出来,并通过OutLook显示给Lucy看。Lucy看到邮件后,答应了Tom的请求,她就会向Tom回复一封邮件,回复邮件的过程与上面的过程是一样的,这里就不细说了。

 

协议简介:SMTP

     SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供与来信有关的通知。(来自百度百科

 

协议简介:POP3

     POP3(Post Office Protocol 3)即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。它是因特网电子邮件的第一个离线协议标准,POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。(来自百度百科

POP 协议支持“离线”邮件处理。其具体过程是:邮件发送到服务器上,电子邮件客户端调用邮件客户机程序以连接服务器,并下载所有未阅读的电子邮件。这种离线访问模式是一种存储转发服务,将邮件从邮件服务器端送到个人终端机器上,一般是 PC机或 MAC。一旦邮件发送到 PC 机或 MAC上,邮件服务器上的邮件将会被删除。但目前的POP3邮件服务器大都可以“只下载邮件,服务器端并不删除”,也就是改进的POP3协议。(来自百度百科

 

协议简介:IMAP

      Internet Mail Access Protocol(交互式邮件存取协议)IMAP是斯坦福大学在1986年开发的研发的一种邮件获取协议。它的主要作用是邮件客户端(例如MS Outlook Express)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。

IMAP协议比较酷的功能是用户可以维护自己在服务器上的邮件目录;可以直接抓取邮件的特定部分(例如只有文本)。(来自百度百科

      IMAP的一个与POP3的区别是:IMAP它只下载邮件的主题,并不是把所有的邮件内容都下载下来,而是你邮箱当中还保留着邮件的副本,没有把你原邮箱中的邮件删除,你用邮件客户软件阅读邮件时才下载邮件的内容。较好支持这两种协议的邮件客户端有:ThunderMail,Foxmail,outlook等。(来自百度百科

 

协议简介:Mime

     由于SMTP这个协议开始是基于纯ASCⅡ文本的,在二进制文件上处理得并不好。后来开发了用来编码二进制文件的标准,如MIME,以使其通过SMTP来传输。今天,大多数SMTP服务器都支持8位MIME扩展,它使二进制文件的传输变得几乎和纯文本一样简单。(来自百度百科

 

在.NET中如何实现:

    在.NET中,已经有实现邮件发送的相关类,在System.Net.Mail命名空间下,有实现SMTP连接的SmtpClient类,还有封装邮件信息的实体类MailMessage。我们首先需要用给定的服务器地址和端口号实例化一个SmtpClient对象;

   1:  
   2: SmtpClient smtp = new SmtpClient(smtpHost, smptPort);
3:smtp.Credentials = new NetworkCredential("test.qq.com", "test008");

   然后定义一个MailMessage对象,MailMessage对象里面包括了一封标准邮件所需要的所有信息,比如收件人,邮件主题,邮件内容等。你只需要对相关的属性赋值即可,

   1: MailMessage msg = new MailMessage(sender, receivers, title, content);
   2: msg.BodyEncoding = Encoding.UTF8;
   3: msg.SubjectEncoding = Encoding.UTF8;
   4: msg.IsBodyHtml = true;
   5: smtp.Send(msg);
   6: msg.Dispose();

    赋值完毕后,调用smtp.Send(msg);邮件即可发送出去。注意,如果有身份验证的话,还需要输入你的用户名和密码。msg.CC.Add(new MailAddress("test002qq.com"));这样可以增加抄送人;msg.Attachments.Add()可以增加相应的附件。还有其他一些用法参见文章最后的参考网址。

 

常用的邮件服务器地址:(以下数据来自网络)

126邮箱

POP3服务器:pop.126.com
SMTP服务器:smtp.126.com

163邮箱

POP3服务器:pop.163.com
SMTP服务器:smtp.163.com

 

yahoo邮箱

注意:yahoo在foxmail 4.1以上的版本设置如下:

POP3服务器:pop.mail.yahoo.com.cn
SMTP服务器:smtp.mail.yahoo.com.cn

 

Sohu邮箱

POP3服务器:pop3.sohu.com
SMTP服务器:smtp.sohu.com

 

Gmail邮箱

第一步:要手动配置: POP3服务器是pop.gmail.com
SMTP服务器是smtp.gmail.com
第二步:使用自动配置文件 http://toolbar.google.com/gmail-helper/GmailConfig.exe
这样就OK喽~ 可以发送和接收 Gmail 邮件了。

QQ邮箱

  POP3服务器:pop.qq.com
SMTP服务器:smtp.qq.com
SMTP服务器需要身份验证

 

从上面大家可以看出,一般的POP3邮件服务器地址为pop然后加上自己的域名,SMTP邮件服务器地址为smtp加上自己的域名。常用的邮件服务器地址都可以在网上找到。各大型邮箱smtp服务器及端口收集

 

遇到的问题:

     当我用qq邮箱测试时,发现邮件并没有发送成功。找了半天原因,才发现原来是我的QQ邮箱的SMTP服务没有启用,如果你按照上面的代码,也没有发送成功,有可能也是这个原因。我们只需要进入自己的邮箱,把这个服务启用即可。

     首先登录QQ邮箱,选择“邮箱设置”的“账户”一栏

image

     然后往下浏览到“POP3/IMAP/SMTP/Exchange服务”这个地方,打上对勾即可。

image

     有没有发现上面的单词那么熟悉,就是上面讨论的几种协议,现在发现理解是不是更容易了。QQ邮箱做得比较好,如果你还没有理解这些协议的意思,你可以点击后面的超链接,里面有更详细的解释。

 

配置用户代理:

    如果你理解了上面的内容,配置用户代理将是一件非常容易的事情。这里以FoxMail为例,解释一个地方就可以了,就是设置邮件服务器。(截图来自QQ邮箱里面的“帮助”)

image

    上面的接收服务器类型,你可以选择POP3,也可以选择IMAP,选择了什么类型的,下面的地址中就应该输入这个类型的邮件服务器地址。最下面的是发送邮件服务器,这个没得选,非要写SMTP邮件服务器的地址。对于其他设置,你完全可以登录进入QQ邮箱,里面的帮助说的非常详细,而且网上也有许多配置用户代理的资料,可以参考。

 

总结

     上面的就是邮件发送的一些基本知识,大部分内容网上都有,我这里只是把它串起来,希望对大家有帮助,如果有任何错误,请指正。还有一点要说明的是,.NET中封装的“太好”了,完全对我们屏蔽了实现的具体细节,如果想深入研究,完全可以自己写一个发送邮件的类,实现SMTP通信,而不使用.NET中的SMTPClient类,如果大家有兴趣,可以继续研究。

 

参考资料:

《百度百科》

《QQ邮箱中的帮助》

谢希仁《计算机网络》

北冰洋(推荐,有动画演示)

 

.NET中实现邮件发送的相关参考资料:

http://www.cnblogs.com/aminta/archive/2008/11/08/1281357.html

http://blog.csdn.net/marklr/article/details/4432022

http://msdn.microsoft.com/zh-cn/library/system.net.mail.mailmessage.attachments.aspx

http://blog.csdn.net/byondocean/article/details/6317101

http://www.cnblogs.com/ustbwuyi/archive/2007/05/28/762581.html