WEB --Java Mail项目总结
1.JavaMail项目的分布结构.
Java mail 包括三部分:邮件服务器(Mail Server),数据库服务器(DB Server),Web服务器(Web Server)。另外的一些应用程序,如(Outlook,forxmail)都是C/S结构上的客户端。如图所示:
2.Mail的流程图:
邮件在传输的过程中是要遵守一定的规则-----协议。
POP3/IMAP协议是用来从自己邮箱服务器里接收自己的邮件。
SMTP 协议是用来发送邮件的。
在客户端中我们用Javamail.jar包来编写客户端程序。服务器端根据协议的需求来实现功能。
从上图中可以看到邮件的转发的一个过程,当两个邮箱地址属于不同的服务器的时候,邮件服务器会根据@后面的域名来转发邮件。
3.邮件协议(SMTP/POP3)
通过在cmd中的命令行来了解协议实现。协议中用一些返回量来实现信息的交互,这些命令和返回量都被转换成二进制在网络中传输。在客户端或者服务器端统过这些协议的规则,将发送的信息转换成原来的信息。
********************************SMTP****************************************
telnet 192.168.0.1 25 --------------------------------------- 使用 telnet 命令连接服务器 25 端口
220 Winmail Mail Server ESMTP ready ------------------------- 显示服务器的标识名称 (Winmail 管理工具->高级设置->系统参数->基本参数中可更改)
helo cnu.com ------------------------------------------------ 向服务器标识用户身份,发信不要认证,跳过下面几步直接发送 mail from 命令
250 Winmail Mail Server
【ehlo cnu.com ------------------------------------------------ ESMTP 命令,发信需要认证。
250-Winmail Mail Server
250-PIPELINING
250-AUTH=LOGIN PLAIN
250-AUTH LOGIN PLAIN
250-SIZE 20480000
250 8BITMIME
auth login ------------------------------------------------- 进行用户身份认证
334 VXNlcm5hbWU6
Y29zdGFAYW1heGl0Lm5ldA== ----------------------------------- BASE64 加密后的用户名
334 UGFzc3dvcmQ6
MTk4MjIxNA== ----------------------------------------------- BASE64 加密后的密码
235 auth successfully -------------------------------------- 身份认证成功
(535 auth failure ------------------------------------------ 身份认证失败)】
发到本系统中域名下的账户可跳过身份认证。
mail from: <test1@domain.com> ------------------------------ mail from 地址 test1@domain.com
250 ok ----------------------------------------------------- 命令执行成功
rcpt to: <test2@domain.com> -------------------------------- 递送给地址 test2@domain.com
250 ok ----------------------------------------------------- 命令执行成功
550 No such user here
data ------------------------------------------------------- 数据传输初始化
354 go ahead ----------------------------------------------- 开始传输数据
From: test1@domain.com
To: test2@domain.com
Date: Mon, 25 Oct 2004 14:24:27 +0800
Subject: test mail
Hi, test2
This is a test mail, you don't reply it.
.
------------------------------------------------------------ 数据内容,包括BASE64加密后的邮件内容, 以 CRLF.CRLF 结束数据传输
250 ok message accepted for delivery ----------------------- 命令执行成功
quit ------------------------------------------------------- 结束会话
221 Winmail Mail Server
Connection closed by foreign host .------------------------- 断开连接
*********************************POP3*************************************
S: +OK POP3 server ready
C: USER mrose
S: +OK mrose is a real hoopy frood
S: -ERR sorry, no mailbox for frated here
C: PASS secret
S: +OK mrose's maildrop has 2 messages (320 octets)
S: -ERR maildrop already locked
C:STAT
S: +OK 2 320
C:LIST
S: +OK 2 messages (320 octets)
S: 1 120
S: 2 200
S:.
【C: LIST 2
S: +OK 2 200
S: -ERR no sUCh message, only 2 messages in maildrop
】
C: RETR 1
S: +OK 120 octets
S: ………
S: .
S: .
S: -ERR
C: DELE 1
C:QUIT
S: +OK dewey POP3 server signing off
4.服务器:
在编写服务器端得程序时,应该完全符合SMTP协议和POP3协议规范的要求。在有统一的标准的情况下,才能解析出正确的信息。我们要根据协议的需求来实现协议要求的每一个步骤。也就是上面第三点提到的协议的一些返回参数。
可以肯定的是在编写服务器端程序的时候要详细的了解协议的要求。也就是协议的需求。需求是很重要的,如果没有按照需求,所做的工作都是徒劳的,无效的。在测试和运行的过程中会出现很多的BUG。每一个细节都要注意。
我从这里,知道了需求的重要性。
服务器端 包括SMTP服务器和POP3服务器它们实现不同的功能。同时包括Socket通信和多线程。还要求邮件服务器有一定的安全性,所以在ehlo 的时候需要认证。
用户的用户名和密码都是以Base64编码后传输的。
5.客户端:
客户端程序是Web浏览器,所以我们要在服务器上建立一个Web服务器程序,来提供同邮件服务器和数据库服务器的交互。Web服务器是用JSP/Servlet+JDBC来编写的。
同时SUN公司提供了JavaMail的jar包,在J2EE体系中,使用JavaMail API(接口)来实现邮件的发送和收取功能,所以不需要像邮件服务器端程序那样去了解邮件发送和接收的底层实现的细节。应为JavaMail提供了统一的接口来控制电子邮件。
JavaMail 有很多核心的抽象类,都位于Javax.mail包中。分别如下:
Message,Store,Folder,Transport.
**********************Javamail Transport邮件发送***********************
String host="stmp.126.com";
String username="zhangsan@126.com";
String password="123456";
Properties props=new Properties();
Session session=Session.getDefaultInstance(props, null);
MimeMessage message=new MimeMessage(session);
Transport transport=session.getTransport("smtp");//指定协议
transport.connect(host, username, password); //连接邮件服务器 transport.sendMessage(message, message.getAllRecipients());
//发送邮件
transport.close(); //关闭连接
***********************JavaMail Sore&Floder接收邮件***********************
Store store=session.getStore("pop3");
store.connect(host, username, password);
Folder folder=store.getFolder("mails");
folder.open(Folder.READ_ONLY);
Message message[]=folder.getMessages();
5.1复合邮件的结构图
--转载 张孝祥
--转载 张孝祥