目录
邮件收发
基本流程
具体过程
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(Pot Office Protocol 3) 即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。它是因特网电子邮件的第一个离线协议标准,POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
POP3协议支持"离线"邮件处理。其具体过程是:邮件发送到服务器上,电子邮件客户端调用邮件客户机程序以连接服务器,并下载所有未阅读的电子邮件。这种离线访问模式是一种存储转发服务,将邮件从邮件服务器端送到个人终端机器上,一般是PC机或MAC。一旦邮件发送到PC机或MAC上,邮件服务器上的邮件将会被删除。但目前的POPg邮件服务器大都可以只下载邮件,服务器端并不删除”,也就是改进的POP3协议。
IMAP
Internet Mail Access Protocol (交互式邮件存取协议)。IMAP是斯坦福大学在1986年开发的研发的一种邮件获取协议。它的主要作用是邮件客户端(例如MS Outlook Express)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。
IMAP协议比较酷的功能是用户可以维护自己在服务器上的邮件目录;可以直接抓取邮件的特定部分(例如只有文本)。
IMAP的一个与POPs的区别是:IMAP它只下载邮件的主题,并不是把所有的邮件内容都下载下来,而是你邮箱当中还保留着邮件的副本,没有把你原邮箱中的邮件删除,你用邮件客户软件阅读邮件时才下载邮件的内容。较好支持这两种协议的邮件客户端有:ThunderMail.Foxmail,outlook等。
MIME
由于SMTP这个协议开始是基于纯ASCI文本的,在二进制文件上处理得并不好。后来开发了用来编码二进制文件的标准,如MIME,以使其通过SMTP来传输。今天,大多数SMTP服务器都支持8位MIME扩展,它使二进制文件的传输变得几乎和纯文本一样简单。
在.NET中如何实现
常用的邮件服务器地址:
126邮箱
POP3服务器:pop.126.comSMTP服务器:smtp.126.com
163邮箱
POP3服务器:pop.163.comSMTP服务器: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服务器及端收集。
可能会遇到的问题
配置用户代理
编写Socket程序发送电子邮件
// from:<[email protected]>
// to:< [email protected] >
代码如下:
public static void main(String[] args) throws Exception{
//创建socket对象
Socket sk=new Socket("smtp.sohu.com",25);
//创建输出流对象
OutputStream os=sk.getOutputStream();
//创建输入对象
sk.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(sk.getInputStream()));
System.out.println(br.readLine());
os.write("ehlo redarmychen/r/n".getBytes());
System.out.println(br.readLine());
System.out.println(br.readLine());
System.out.println(br.readLine());
os.write("auth login/r/n".getBytes());
System.out.println(br.readLine());
os.write("cmVkYXJteWNzZG4=/r/n".getBytes());
System.out.println(br.readLine());
os.write("cmVkYXJteWNzZG4=/r/n".getBytes());
System.out.println(br.readLine());
os.write("mail from:<[email protected]>/r/n".getBytes());
System.out.println(br.readLine());
os.write("rcpt to:< [email protected] >/r/n".getBytes());
System.out.println(br.readLine());
os.write("data/r/n".getBytes());
System.out.println(br.readLine());
os.write("from:<[email protected]>/r/n".getBytes());
System.out.println(br.readLine());
os.write("to:< [email protected] >/r/n".getBytes());
System.out.println(br.readLine());
os.write("subject:中奖了,快去看看吧>/r/n".getBytes());
System.out.println(br.readLine());
os.write("恭喜你获得一万元的大奖,请尽快登陆xxxxxxxxx领取/r/n".getBytes());
os.write("./r/n".getBytes());
System.out.println(br.readLine());
os.write("quit/r/n".getBytes());
br.close();
os.close();
sk.close();
}