java发送邮件

来源:互联网 发布:placeholder.js 编辑:程序博客网 时间:2024/06/05 04:16

1.介绍:

Java Mail API的开发是SUN为Java开发者提供公用API框架的持续努力的良好例证。提倡公用框架,反对受限于供应商的解决方案,充分预示着一个日益开放的开发环境的建立。
  Java Mail API的结构本身证明了它的开发者的基本目标之一--软件开发的工作量应该取决于应用程序本身的复杂程度以及开发者所要求的控制程度。换句话说,Java Mail API尽可能地保持简单。乍看起来,JavaMail API所拥有的类总数以及类之间的关系可能让人误解为要花费漫长的学习时间。实际上,一旦正式开始使用,你就会发现该API不失为在应用程序中加入健壮的邮件/通讯支持的简单工具。

2.安装:

安装前要确保你的机子上安装得有标准版的JDK和Web服务器,并且已配置好,有关它们的安装方法,请参考其它文章(网上到处都有).

(1).安装JavaMail API。现在最常用的 JavaMail API 版本是1.3.
  要使用 JavaMail 1.3 API,请下载 JavaMail 1.3 实现,解开Javamail-1_3.zip 文件,并将 mail.jar 文件添加到 CLASSPATH 中。除了核心类,随版本 1.3 实现一起提供的还有 SMTP、IMAP4 和 POP3 供应商。
  
(2).JavaBeans Activation Framework(1.0.2版) 的安装
JavaMail API 的所有版本都需要 JavaBeans Activation Framework 来支持任意数据块的输入及相应处理。功能似乎不多,但目前许多浏览器和邮件工具中都能找到这种基本的 MIME 型支持。下载完框架后,解开 jaf1_0_2.zip 文件,并将 activation.jar 文件添加到 CLASSPATH 中。
  

注: 如果您使用的JDK是J2EE,就没有什么特定的事非要用基本 JavaMail API来做不可;J2EE 的类就能处理了,因为它本身就包含有JavaMail API和JAF,您只需要确将 j2ee.jar 文件添加到您的CLASSPATH 中并已全部设置好。

3.JavaMail的常用类介绍

事先说明:

没用过JavaMail的人可能看不懂这些介绍,不过不要紧,后面的文章有具体的实例,到时也可倒回来查看这些类的用法.


(1) javax.mail.Properties类
  JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机.

用法:
 Properties props = new Properties ();
   props.put("mail.smtp.host", "smtp.163.com");//可以换上你的smtp主机名。


(2) javax.mail.Session类
  这个Session类代表JavaMail 中的一个邮件session. 每一个基于 JavaMail的应用程序至少有一个session但是可以有任意多的session。 在这个例子中, Session对象需要知道用来处理邮件的SMTP 服务器。

用法:
   Session sendMailSession;
   sendMailSession = Session.getInstance(props, null);


(3) javax.mail.Transport类
  邮件是既可以被发送也可以被受到。JavaMail使用了两个不同的类来完成这两个功能:Transport 和Store. Transport 是用来发送信息的,而Store用来收信。对于这的教程我们只需要用到Transport对象。

用法:
Transport transport;
  transport = sendMailSession.getTransport("smtp");

  用JavaMail Session对象的getTransport 方法来初始化Transport。传过去的字符串申明了对象所要使用的协议,如"smtp"。这将为我们省了很多时间。因为JavaMail以境内置了很多协议的实现方法。

 注意: JavaMail并不是绝对支持每一个协议,目前支持IMAP、 SMTP和 POP3.


(4) javax.mail.MimeMessage类
  Message对象将存储我们实际发送的电子邮件信息,Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。

  用法:
Message newMessage = new MimeMessage(sendMailSession);


(5) javax.mail.InternetAddress类
一旦您创建了 Session 和 Message,并将内容填入消息后,就可以用Address确定信件地址了。和 Message 一样,Address 也是个抽象类。您用的是Javax.mail.internet.InternetAddress 类.

用法:
InternetAddress from=new InternetAddress("xxf@cafe.com");


(6) javax.mail.Store类
Store类实现特定邮件协议上的读、写、监视、查找等操作。通过Javax.mail.Store类可以访问Javax.mail.Folder类。

用法:
Store store=s.getSorte("pop3");//s为一个邮件会话
store.connect(popserver,username,password);//通过你提供的pop地址,用户名和密码登录你的邮箱


(7) javax.mail.Folder类
Folder类用于分级组织邮件,并提供照Javax.mail.Message格式访问email的能力。

用法:
Folder folder=store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);


(8) javax.mail.Internet.MimeMultpart
一般保存电子邮件内容的容器是Multipart抽象类,它定义了增加和删除及获得电子邮件不同部分内容的方法.由于Multipart是抽象类,我们必须为它使用一个具体的子类,JavaMail API提供javax.mail.Internet.MimeMultpart类来使用MimeMessage对象.

用法:
MimeMultipart multipart=new MimeMultipart();

注:我们使用MimeMultipart对象的一个方法是addBodyPart(),它在我们的电子邮件内容里添加BodyPart(BodyPart类在下面紧接着要介绍)对象.消息可以有很多部分,一个BodyPart可以代表一个部分.


(9) javax.mail.Internet.MimeBodyPart类

MimeBodyPart是BodyPart具体用于mimeMessage的一个子类.
MimeBodyPart对象代表一个MimeMessage对象内容的一部分.每个MimeBodyPart被认为有两部分:
⊙一个MIME类型
⊙匹配这个类型的内容

用法:
MimeBodyPart mdp=new MimeBodyPart();
String text="Hello JavaMail!";
mdp.setContent(text,"text/plain");//定义MIME类型为text/plain,并设置MimeBodyPart的内容.


(10) javax.activation.DataHandler类(包含在JAF中)
JavaMail API不限制信息只为文本,任何形式的信息都可能作茧自缚MimeMessage的一部分.除了文本信息,作为文件附件包含在电子邮件信息的一部分是很普遍的.JavaMail API通过使用DataHandler对象,提供一个允许我们包含非文本BodyPart对象的简便方法.

用法:
DataHandler dh=new DataHandler(text,type);
mdp.setDatahandler(dh);//mdp是一个MimeBodyPart对象


(11) javax.activation.FileDataSource类(包含在JAF中)
一个FileDataSource对象可以表示本地文件和服务器可以直接访问的资源.一个本地文件可以通过创建一个新的MimeBodyPart对象附在一个mimeMessage对象上.

用法:
MimeMultipart mm=new MimeMultipart();
MimeBodyPart mdp=new MimeBodyPart();
FileDataSource fds=new FileDataSource("c:/exam.txt");
mdp.setDataHandler(new DataHandler(fds)); //设置数据源
mm.addBodyPart(mdp); //为当前消息MimeMultipart对象增加MimeBodyPart


(12) javax.activation.URLDataSource类(包含在JAF中)
远程资源,URL不会指向它们,由一个URLDataSource对象表示.一个远程资源可以通过创建一个新mimeBodyPart对象附在一个mimeMessage对象上(同FileDataSource差不多).

用法:
与FileDataSource唯一不同的是数据源的设置:
URLDataSource uds=new URLDataSource("http://www.cnjsp.com/logo.gif");

4.试着编写第一个发送程序

在前面我们已对JavaMail作了一些介绍,下面我们可试着写自己的程序了.

首先,我们先写一个撰写邮件的html程序index.htm,如下:
-------------------------------------------------------------------------------------------
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>撰写邮件</title>
</head>

<body>
<form name="form1" method="post" action="testmail.jsp">
<table width="75" border="0" align="center" cellspacing="1" bgcolor="#006600" class="black">
<tr bgcolor="#FFFFFF">
<td width="24%">收信人地址:</td>
<td width="76%">
<input name="to" type="text" id="to"></td>
</tr>
<tr bgcolor="#FFFFFF">
<td>主题:</td>
<td>
<input name="title" type="text" id="title"></td>
</tr>
<tr>
<td height="107" colspan="2" bgcolor="#FFFFFF">
<textarea name="content" cols="50" rows="5" id="content"></textarea></td>
</tr>
<tr align="center">
<td colspan="2" bgcolor="#FFFFFF">
<input type="submit" name="Submit" value="发送">
<input type="reset" name="Submit2" value="重置">
</td>
</tr>
</table>
</form>
</body>
</html>


接着,我们再写一个处理程序testmail.jsp,如下:
-----------------------------------------------------------------------------------------
<%@ page contentType="text/html;charset=GB2312" %>
<%request.setCharacterEncoding("gb2312");%><!--中文处理代码-->

<!--引入要用到的类库-->
<%@ page import="java.util.*,javax.mail.*"%>
<%@ page import="javax.mail.internet.*"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>发送成功</title>
</head>

<body>
<%
try{

//从html表单中获取邮件信息
String tto=request.getParameter("to");
String ttitle=request.getParameter("title");
String tcontent=request.getParameter("content");

Properties props=new Properties();//也可用Properties props = System.getProperties();
props.put("mail.smtp.host","smtp.163.net");//存储发送邮件服务器的信息
props.put("mail.smtp.auth","true");//同时通过验证
Session s=Session.getInstance(props);//根据属性新建一个邮件会话
s.setDebug(true);

MimeMessage message=new MimeMessage(s);//由邮件会话新建一个消息对象

//设置邮件
InternetAddress from=new InternetAddress("boy@163.net");
message.setFrom(from);//设置发件人
InternetAddress to=new InternetAddress(tto);
message.setRecipient(Message.RecipientType.TO,to);//设置收件人,并设置其接收类型为TO
message.setSubject(ttitle);//设置主题
message.setText(tcontent);//设置信件内容
message.setSentDate(new Date());//设置发信时间

//发送邮件
message.saveChanges();//存储邮件信息
Transport transport=s.getTransport("smtp");
transport.connect("smtp.163.net","boy","iloveyou");//以smtp方式登录邮箱
transport.sendMessage(message,message.getAllRecipients());//发送邮件,其中第二个参数是所有
//已设好的收件人地址
transport.close();

%>
<div align="center">
<p><font color="#FF6600">发送成功!</font></p>
<p><a href="recmail.jsp">去看看我的信箱</a><br>
<br>
<a href="index.htm">再发一封</a> </p>
</div>
<%
}catch(MessagingException e){
out.println(e.toString());
}
%>
</body>
</html>

**********************************注意***************************************

有好多书上和网上的文章在关键部分都是这样写testmail.jsp的,如下:

String tto=request.getParameter("to");
String ttitle=request.getParameter("title");
String tcontent=request.getParameter("content");
Properties props=new Properties();
props.put("mail.smtp.host","smtp.163.net");
Session s=Session.getInstance(props);
MimeMessage message=new MimeMessage(s);

InternetAddress from=new InternetAddress("boy@163.net");
message.setFrom(from);
InternetAddress to=new InternetAddress(tto);
message.setRecipient(Message.RecipientType.TO,to);

message.setSubject(ttitle);
message.setText(tcontent);
message.setSentDate(new Date());

Store store=s.getStore("pop3");
store.connect("pop.163.net","boy","iloveyou");//以pop3的方式登录邮箱
Transport transport=s.getTransport("smtp");
transport.send(message);
store.close();

事实上,这种方式并不可靠,因为很多电子邮局的smtp服务器要求我们通过验证,所以用这种方式发邮件时,只能发给同类邮箱(即相同smtp的邮箱),甚至有时同类邮箱也发不出去.以上两种方式我试过很多次,结果证明第一种方式是最可靠的.


好了,我相信你应该会写最简单的Email发送程序了.OK,下一次我们将说说怎样写发送HTML格式的邮件.

5.发送HTML格式的邮件

所谓HTML格式,就是超文本格式.你的邮件可以用HTML代码编写,发给对方后,对方收到的将是信息将是超文本,超文本比纯文本好看多了.下以面是在以前例子的基础上修改的程序:

<%@ page contentType="text/html;charset=GB2312" %>
<%request.setCharacterEncoding("gb2312");%>
<%@ page import="java.util.*,javax.mail.*"%>
<%@ page import="javax.mail.internet.*"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>发送成功</title>
</head>

<body>
<%
try{
String tto=request.getParameter("to");
String ttitle=request.getParameter("title");
String tcontent=request.getParameter("content");
Properties props=new Properties();
props.put("mail.smtp.host","127.0.0.1");
props.put("mail.smtp.auth","true");
Session s=Session.getInstance(props);
s.setDebug(true);

MimeMessage message=new MimeMessage(s);

//给消息对象设置发件人/收件人/主题/发信时间
InternetAddress from=new InternetAddress("xxf@cafe.com");
message.setFrom(from);
InternetAddress to=new InternetAddress(tto);
message.setRecipient(Message.RecipientType.TO,to);
message.setSubject(ttitle);
message.setSentDate(new Date());


//给消息对象设置内容
BodyPart mdp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象
mdp.setContent(tcontent,"text/html;charset=gb2312");//给BodyPart对象设置内容和格式/编码方式
Multipart mm=new MimeMultipart();//新建一个MimeMultipart对象用来存放BodyPart对
//象(事实上可以存放多个)
mm.addBodyPart(mdp);//将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart)
message.setContent(mm);//把mm作为消息对象的内容

message.saveChanges();
Transport transport=s.getTransport("smtp");
transport.connect("127.0.0.1","xxf","coffee");
transport.sendMessage(message,message.getAllRecipients());
transport.close();
%>
<div align="center">
<p><font color="#FF6600">发送成功!</font></p>
<p><a href="recmail.jsp">去看看我的信箱</a><br>
<br>
<a href="index.htm">再发一封</a> </p>
</div>
<%
}catch(MessagingException e){
out.println(e.toString());
}
%>
</body>
</html>

注:撰写邮件的html文件仍然和前面(请参考jsp和Java Mail(三))那个一样,不需要作任何修改.

怎么样,这个程序是不是很简单呢?如果还有什么不懂的话,请在下面留言.下一次我们将要讲一讲怎样发送附件.

6.发送三种类型的附件

前面我们已学会了发送一般文本邮件和超文本邮件,今天我们将让大家学会编写三种类型的附件的邮件
发送程序.(注:撰写界面仍然用前面的)

<%@ page contentType="text/html;charset=GB2312" %>
<%request.setCharacterEncoding("gb2312");%>
<%@ page import="java.util.*,javax.mail.*"%>
<%@ page import="javax.mail.internet.*"%>
<%@ page import="javax.activation.*"%><!--要发送附件必须引入该库-->
<%@ page import="java.net.*"%><!--要用到URL类-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>发送成功</title>
</head>
<body>
<%
try{
String tto=request.getParameter("to");
String ttitle=request.getParameter("title");
String tcontent=request.getParameter("content");
Properties props=new Properties();
props.put("mail.smtp.host","127.0.0.1");
props.put("mail.smtp.auth","true");
Session s=Session.getInstance(props);
s.setDebug(true);

MimeMessage message=new MimeMessage(s);

//给消息对象设置发件人/收件人/主题/发信时间
InternetAddress from=new InternetAddress("xxf@cafe.com");
message.setFrom(from);
InternetAddress to=new InternetAddress(tto);
message.setRecipient(Message.RecipientType.TO,to);
message.setSubject(ttitle);
message.setSentDate(new Date());

Multipart mm=new MimeMultipart();//新建一个MimeMultipart对象用来存放多个BodyPart对象

//设置信件文本内容
BodyPart mdp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象
mdp.setContent(tcontent,"text/html;charset=gb2312");//给BodyPart对象设置内容和格式/编码方式
mm.addBodyPart(mdp);//将含有信件内容的BodyPart加入到MimeMultipart对象中

//设置信件的附件1(自定义附件:直接将所设文本内容加到自定义文件中作为附件发送)
mdp=new MimeBodyPart();//新建一个存放附件的BodyPart
DataHandler dh=new DataHandler("JavaMail附件测试","text/plain;charset=gb2312");
//新建一个DataHandler对象,并设置其内容和格式/编码方式
mdp.setFileName("xxf.txt");//加上这句将作为附件发送,否则将作为信件的文本内容
mdp.setDataHandler(dh);//给BodyPart对象设置内容为dh
mm.addBodyPart(mdp);//将含有附件的BodyPart加入到MimeMultipart对象中

//设置信件的附件2(用本地上的文件作为附件)
mdp=new MimeBodyPart();
FileDataSource fds=new FileDataSource("g:/xx.txt");
dh=new DataHandler(fds);
mdp.setFileName("dd.txt");//可以和原文件名不一致
mdp.setDataHandler(dh);
mm.addBodyPart(mdp);

//设置信件的附件3(用远程文件作为附件)
mdp=new MimeBodyPart();
URLDataSource ur=new URLDataSource(new URL("http://localhost:8080/jspstudy/email/xx.gif"));
//注:这里用的参数只能为URL对象,不能为URL字串,在前面类介绍时有误(请谅解),这里纠正一下.
dh=new DataHandler(ur);
mdp.setFileName("ss.txt");
mdp.setDataHandler(dh);
mm.addBodyPart(mdp);

message.setContent(mm);//把mm作为消息对象的内容

message.saveChanges();
Transport transport=s.getTransport("smtp");
transport.connect("127.0.0.1","xxf","coffee");
transport.sendMessage(message,message.getAllRecipients());
transport.close();
%>
<div align="center">
<p><font color="#FF6600">发送成功!</font></p>
<p><a href="recmail.jsp">去看看我的信箱</a><br>
<br>
<a href="index.htm">再发一封</a> </p>
</div>
<%
}catch(MessagingException e){
out.println(e.toString());
}
%>
</body>
</html>

发送附件是不是很有趣呢?但是在这里由于没有修改撰写界面,要发送的附件只能在程序里固定,所以一点都不灵活.不用担心,下一次我们将重写撰写界面,当然同时也会修改邮件处理程序,到时我们将能灵活地发送自己的邮件.

七.编写灵活的发送程序

本小节没加什么新鲜的东西,但是综合了以前的所有内容,可以让你灵活地发送你想要发的邮件.看了本小节之后对你会感觉到非常有用.

更改后的撰写界面程序如下:
-------------------------------------------------------------------------------------------
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>撰写邮件</title>
</head>
<body>
<form action="testall.jsp" method="post" name="form1">
<table width="75" border="0" align="center" cellspacing="1" bgcolor="#006600" class="black">
<tr bgcolor="#FFFFFF">
<td width="24%">收信人地址:</td>
<td width="76%"> <input name="to" type="text" id="to"></td>
</tr>
<tr bgcolor="#FFFFFF">
<td>主题:</td>
<td> <input name="title" type="text" id="title"></td>
</tr>
<tr>
<td height="18" colspan="2" bgcolor="#FFFFFF">信件类型
<select name="emailtype" id="emailtype">
<option value="text/plain" selected>Text</option>
<option value="text/html">Html</option>
</select></td>
</tr>
<tr>
<td height="53" colspan="2" bgcolor="#FFFFFF"><textarea name="content" cols="50" rows="5" id="content"></textarea></td>
</tr>
<tr align="center">
<td colspan="2" bgcolor="#FFFFFF">附件1(自定义):
<input name="fj1" type="text" id="fj1">
(输入文本信息) </td>
</tr>
<tr align="center" valign="bottom">
<td colspan="2" bgcolor="#FFFFFF">附件2(本地):
<input name="fj2" type="file" id="fj2" size="10"></td>
</tr>
<tr align="center">
<td colspan="2" bgcolor="#FFFFFF">附件3(远程):
<input name="fj3" type="text" id="fj3" value="http://">
(输入URL)</td>
</tr>
<tr align="center">
<td colspan="2" bgcolor="#FFFFFF"> <input type="submit" name="Submit" value="发送">
<input type="reset" name="Submit2" value="重置"></td>
</tr>
</table>
</form>
</body>
</html>


处理邮件的JSP程序如下:
----------------------------------------------------------------------------------------
<%@ page contentType="text/html;charset=GB2312" %>
<%request.setCharacterEncoding("gb2312");%>
<%@ page import="java.util.*,javax.mail.*"%>
<%@ page import="javax.mail.internet.*"%>
<%@ page import="javax.activation.*"%><!--要发送附件必须引入该库-->
<%@ page import="java.net.*"%><!--要用到URL类-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>发送成功</title>
</head>
<body>
<%
try{
String tto=request.getParameter("to");
String ttitle=request.getParameter("title");
String emailtype=request.getParameter("emailtype");//获取email类型
String tcontent=request.getParameter("content");
String tfj1=request.getParameter("fj1");
String tfj2=request.getParameter("fj2");
String tfj3=request.getParameter("fj3");

Properties props=new Properties();
props.put("mail.smtp.host","127.0.0.1");
props.put("mail.smtp.auth","true");
Session s=Session.getInstance(props);
s.setDebug(true);

MimeMessage message=new MimeMessage(s);

//给消息对象设置发件人/收件人/主题/发信时间
InternetAddress from=new InternetAddress("xxf@cafe.com");
message.setFrom(from);
InternetAddress to=new InternetAddress(tto);
message.setRecipient(Message.RecipientType.TO,to);
message.setSubject(ttitle);
message.setSentDate(new Date());

Multipart mm=new MimeMultipart();//新建一个MimeMultipart对象用来存放多个BodyPart对象

//设置信件文本内容
BodyPart mdp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象
mdp.setContent(tcontent,emailtype+";charset=gb2312");//给BodyPart对象设置内容和格式/编码方式
mm.addBodyPart(mdp);//将含有信件内容的BodyPart加入到MimeMultipart对象中

//设置信件的附件1(自定义附件:直接将所设文本内容加到自定义文件中作为附件发送)
mdp=new MimeBodyPart();//新建一个存放附件的BodyPart
DataHandler dh=new DataHandler(tfj1,"text/plain;charset=gb2312");
//新建一个DataHandler对象,并设置其内容和格式/编码方式
mdp.setFileName("text.txt");//加上这句将作为附件发送,否则将作为信件的文本内容
mdp.setDataHandler(dh);//给BodyPart对象设置内容为dh
mm.addBodyPart(mdp);//将含有附件的BodyPart加入到MimeMultipart对象中

//设置信件的附件2(用本地上的文件作为附件)
mdp=new MimeBodyPart();
FileDataSource fds=new FileDataSource(tfj2);
dh=new DataHandler(fds);
int ddd=tfj2.lastIndexOf("\\");
String fname=tfj2.substring(ddd);//提取文件名
String ffname=new String(fname.getBytes("gb2312"),"ISO8859-1");//处理文件名是中文的情况
mdp.setFileName(ffname);//可以和原文件名不一致,但最好一样
mdp.setDataHandler(dh);
mm.addBodyPart(mdp);

//设置信件的附件3(用远程文件作为附件)
mdp=new MimeBodyPart();


URL urlfj=new URL(tfj3);
URLDataSource ur=new URLDataSource(urlfj);
//注:这里用的参数只能为URL对象,不能为URL字串,在前面类介绍时有误(请谅解),这里纠正一下.
dh=new DataHandler(ur);
int ttt=tfj3.lastIndexOf("/");
String urlname=tfj3.substring(ttt);
//String urlfname=new String(urlname.getBytes("gb2312"),"ISO8859-1");//不知怎么回事,这里不能处理中文问题
mdp.setFileName(urlname);
mdp.setDataHandler(dh);
mm.addBodyPart(mdp);

message.setContent(mm);//把mm作为消息对象的内容

message.saveChanges();
Transport transport=s.getTransport("smtp");
transport.connect("127.0.0.1","xxf","coffee");
transport.sendMessage(message,message.getAllRecipients());
transport.close();
%>
<div align="center">
<p><font color="#FF6600">发送成功!</font></p>
<p><a href="recmail.jsp">去看看我的信箱</a><br>
<br>
<a href="index.htm">再发一封</a> </p>
</div>
<%
}catch(MessagingException e){
out.println(e.toString());
}
%>
</body>
</html>

 

 

 

JAVA MAIL API
一、Java Mail API本质上是基于SMTP协议、POP协议、IMAP协议和MIME协议
1、SMTP协议
   简单邮件传输协议是用于传送电子邮件的机制。在Java Mail API环境中,基于JavaMail的应用程序将于与Internet服务提供商的SMTP服务器通信,SMTP服务器把消息转发给用做接收消息的SMTP服务

器。
2、POP协议
   邮局协议是Internet上大多数人用来接收邮件的机制。
3、IMAP协议
   Internet消息访问协议是用于接收消息的更加高级的协议。
4、MIME协议
   多用途的国际邮件扩充协议定义传输的内容。
二、Java Mail开发包
Java Mail API的核心类包括会话、消息、地址、身份验证、传输、存储和文件夹。
1、会话类(Session)
   Session类定义了一个基本的邮件会话。Session对象利用java.util.Properties对象获取邮件服务器、用户名和密码等信息,以及其他可在整个应用程序中共享的信息。
   创建默认会话
Properties props = new Properties();
        ...//填充Properties对象
        Session session = Session.getDefaultInstance(props,null);
   创建独特会话
        Properties props = new Properties();
        ...//填充Properties对象
        Session session = Session.getInstance(props,null);
   Null参数是一种Authenticator(认证)对象
2、消息类(MimeMessage)
   一个MimeMessage对象是一种MIME类型和报头的消息。
   可以通过将Session对象传递给MimeMessage构造器的方法来创建消息:
   MimeMessage message = new MimeMessage(session);
   一旦创建了消息,就可以设置消息的各个部分
设置内容的基本机制是setContent()方法,它带有表示内容和MIME类型的参数。
   message.setContent("hello","text/plain");
如果消息是纯文本
   message.setText("hello");
设置主题
   message.setSubject("subject");
3、地址类
   用Address类为信件标上地址。
   要创建只带有电子邮件地址的地址,可以把电子邮件地址传递给Address类的构造器:
Address address = new InternetAddress("");
   如果想要一个名字出现在电子邮件地址后,也可以将其传递给构造器:
Address address = new InternetAddress("");
   地址与消息连接:setFrom()和setReplyTo()
4、身份验证类
   在创建时,必须用会话记录Authentication类。其后,当需要进行身份验证时,通知Authentication,将会弹出一个窗口,或从一个配置文件中读取用户名和密码,并把他们作为一个

PasswordAuthentication对象返回给调用程序。
Properties props = new Properties();
...//填充Properties对象
Authentication auth = new MyAuthenticator();
        Session session = Session.getDefaultInstance(props,auth);
5、传输类
   默认版本
   Transport.send(message);
   从用于协议的会话中获取一个特定的实例,然后传递用户名和密码并发送消息,最后关闭连接
   message.saveChanges();
        Transport transport = session.getTransport("smtp");
   transport.contect(host,username,password);
transport.sendMessage(message,message.getAllRecipients());
transport.close();
6、存储类和文件夹类
   Store store = session.getStore("pop3");
   store.connect(host,username,password);
   Folder folder = store.getFolder("INBOX");
   folder.open(Folder.READ_ONLY);
   Message message[] = folder.getMessages();
   对于POP3协议,唯一可用的文件夹是INBOX。如果使用的是IMAP协议,则可以使用其他的文件夹。
   一旦读取消息,可以用getContent()方法获取其内容,或使用writeTo()方法将其内容写到一个流中。getContent()方法只获取消息内容,而writeTo()方法则还会输出报头。
   System.out.println(((MimeMessage)message).getContent());
   读取完邮件后,就可以关闭对文件夹和存储的连接
   folder.close(aBoolean);
   store.close();
三、实例
package com.email;
/**
* @author star
* SendMail.java
*/
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.activation.URLDataSource;
import javax.mail.BodyPart;
import javax.mail.Multipart;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

//import javax.mail.internet.MailDateFormat;

public class SendMail {
        public static String TEXT = "text/plain;charset=gb2312";
        public static String HTML = "text/html;charset=gb2312";
        private String host; //邮件服务器
        private String user; //用户名
        private String pass;//用户密码
        private String from;//发信人
        private String to;//收信人
        private String cc;//Carbon Copy, 抄送邮件给某人
        private String bc;//bcc Blind Carbon Copy,隐蔽副本 隐蔽抄送给某人
        private String subject;//邮件主题
        private BodyPart body;//邮件内容
        private boolean needAuth; //是否需要认证
        private List attaches;//邮件附件
/**
* 构造方法
*
*/
        public SendMail() {
                needAuth = true;
                attaches = new ArrayList();
        }
        /**
         * 构造方法
         * @param host
         */
        public SendMail(String host) {
                needAuth = true;
                attaches = new ArrayList();
                this.host = host;
        }
        /**
         * 构造方法
         * @param host
         * @param user
         * @param pass
         */
        public SendMail(String host, String user, String pass) {
                needAuth = true;
                attaches = new ArrayList();
                this.host = host;
                this.user = user;
                this.pass = pass;
        }
//设置邮件服务器是否需要认证
        public void setNeedAuth(boolean needAuth) {
                this.needAuth = needAuth;
        }
        public void setFrom(String from) {
                this.from = from;
        }
        public void setTo(String to) {
                this.to = to;
        }
        public String getPass() {
                return pass;
        }
        public String getUser() {
                return user;
        }
        public void setPass(String string) {
                pass = string;
        }
        public void setUser(String string) {
                user = string;
        }

        public String getFrom() {
                return from;
        }
        public String getHost() {
                return host;
        }
        public boolean isNeedAuth() {
                return needAuth;
        }
        public String getSubject() {
                return subject;
        }
        public void setHost(String string) {
                host = string;
        }
        public void setBlindTo(String bc) {
                this.bc = bc;
        }
        public void setCopyTo(String cc) {
                this.cc = cc;
        }
        public void setSubject(String subject) {
                this.subject = subject;
        }
/**
* 设置邮件内容的形式
* @param string
* @param contentType
*/
        public void setBody(String string, String contentType) {
                try {
                        body = new MimeBodyPart();
                        DataHandler dh = new DataHandler(string, contentType);
                        body.setDataHandler(dh);
                } catch (Exception exception) {
                }
        }
/**
* 设置邮件的内容的格式为文本格式
* @param string
*/
        public void setBodyAsText(String string) {
                setBody(string, TEXT);
        }
/**
* 以HTMl的形式存放内容
* @param string
*/
        public void setBodyAsHTML(String string) {
                setBody(string, HTML);
        }
/**
* 从文件中自动导入邮件内容
* @param filename
*/
        public void setBodyFromFile(String filename) {
                try {
                        BodyPart mdp = new MimeBodyPart();
                        FileDataSource fds = new FileDataSource(filename);
                        DataHandler dh = new DataHandler(fds);
                        mdp.setDataHandler(dh);
                        attaches.add(mdp);
                } catch (Exception exception) {
                }
        }
/**
* 从一个URL导入邮件的内容
* @param url
*/
        public void setBodyFromUrl(String url) {
                try {
                        BodyPart mdp = new MimeBodyPart();
                        URLDataSource ur = new URLDataSource(new URL(url));
                        DataHandler dh = new DataHandler(ur);
                        mdp.setDataHandler(dh);
                        attaches.add(mdp);
                } catch (Exception exception) {
                }
        }
/**
* 将String中的内容存放入文件showname,并将这个文件作为附件发送给收件人
* @param string 为邮件的内容
* @param showname 显示的文件的名字
*/
        public void addAttachFromString(String string, String showname) {
                try {
                        BodyPart mdp = new MimeBodyPart();
                        DataHandler dh = new DataHandler(string, TEXT);
                        mdp.setFileName(MimeUtility.encodeWord(showname, "gb2312", null));
                        mdp.setDataHandler(dh);
                        attaches.add(mdp);
                } catch (Exception exception) {
                }
        }
/**
* filename为邮件附件
*在收信人的地方以showname这个文件名来显示
* @param filename
* @param showname
*/
        public void addAttachFromFile(String filename, String showname) {
                try {
                        BodyPart mdp = new MimeBodyPart();
                        FileDataSource fds = new FileDataSource(filename);
                        DataHandler dh = new DataHandler(fds);
                        mdp.setFileName(MimeUtility.encodeWord(showname, "gb2312", null));
                        mdp.setDataHandler(dh);
                        attaches.add(mdp);
                } catch (Exception exception) {
                }
        }
/**
* 将互联网上的一个文件作为附件发送给收信人
* 并在收信人处显示文件的名字为showname
* @param url
* @param showname
*/
        public void addAttachFromUrl(String url, String showname) {
                try {
                        BodyPart mdp = new MimeBodyPart();
                        URLDataSource ur = new URLDataSource(new URL(url));
                        DataHandler dh = new DataHandler(ur);
                        mdp.setFileName(MimeUtility.encodeWord(showname, "gb2312", null));
                        mdp.setDataHandler(dh);
                        attaches.add(mdp);
                } catch (Exception exception) {
                }
        }
/**
* 发送邮件,需要身份认证
* @throws Exception
*/
        public void send() throws Exception {
                try {
                   //*****会话类*****//
                        Properties props = new Properties();
                        if (host != null && !host.trim().equals(""))
                                props.setProperty("mail.smtp.host", host);//key   value
                        else
                                throw new Exception("没有指定发送邮件服务器");
                        if (needAuth)
                                props.setProperty("mail.smtp.auth", "true");
                        Session s = Session.getInstance(props, null);
                        //*****消息类*****//
                        MimeMessage msg = new MimeMessage(s);               
                        msg.setSubject(subject);//设置邮件主题
                        msg.setSentDate(new Date());//设置邮件发送时间
                        //*****地址类*****//
                        if (from != null)
                                msg.addFrom(InternetAddress.parse(from));//指定发件人
                        else
                                throw new Exception("没有指定发件人");                       
                        if (to != null)
                                msg.addRecipients(Message.RecipientType.TO,InternetAddress.parse(to));//指定收件人
                        else
                                throw new Exception("没有指定收件人地址");                       
                        if (cc != null)
                                msg.addRecipients(Message.RecipientType.CC,InternetAddress.parse(cc));//指定抄送                       
                        if (bc != null)
                                msg.addRecipients(Message.RecipientType.BCC,InternetAddress.parse(bc));//指定密送
                        Multipart mm = new MimeMultipart();
                        if (body != null)
                                mm.addBodyPart(body);//设置邮件的附件
                        for (int i = 0; i < attaches.size(); i++) {
                                BodyPart part = (BodyPart) attaches.get(i);
                                mm.addBodyPart(part);
                        }                    
                        msg.setContent(mm);//设置邮件的内容
                        //*****传输类*****//
                        msg.saveChanges();//保存所有改变                    
                        Transport transport = s.getTransport("smtp");//发送邮件服务器(SMTP)               
                        transport.connect(host, user, pass);//访问邮件服务器           
                        transport.sendMessage(msg, msg.getAllRecipients());//发送信息
                        transport.close();//关闭邮件传输
                } catch (Exception e) {
                   e.printStackTrace();
                        throw new Exception("发送邮件失败:", e);
                }
        }
}


测试类
index.jsp
<%@ page contentType="text/html;charset=gb2312" language="java" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>发送邮件测试</title>
    <meta name="copyright" content="邮件发送测试. All rights reserver." />
    <meta name="Keywords" content="jsp,servlet,mail" />
    <meta name="Description" content="发送邮件测试" />
    <meta http-equiv="content-type" content="text/html;charset=gb2312" />
</head>
<body>
<form method="post" action="Sendmail.jsp">
   <table border="1" cellpadding="0" cellspacing="3" align="center">
    <tr>
     <td>邮件服务器</td><td><input type="text" name="host" value="smtp.yourServer.com"></td>
    </tr>
    <tr>
     <td>用户名</td><td><input type="text" name="user" value=">
    </tr>
    <tr>
     <td>密码</td><td><input type="password" name="password" value="123456"></td>
    </tr>
    <tr>
     <td>邮件主体</td><td><input type="text" name="subject" value="邮件发送测试"></td>
    </tr>
    <tr>
     <td>收件人</td><td><input type="text" name="to" value=">
    </tr>
    <tr>
     <td>发送人</td><td><input type="text" name="from" value=">
    </tr>
    <tr>
     <td>邮件内容</td><td><input type="text" name="bodyashtml" value="大家好!邮件测试。"></td>
    </tr>
    <tr>
     <td>附件</td><td><input type="text" name="attachfile" value="D:\\test.txt"></td>
    </tr>
    <tr>
     <td><input type="submit" name="submit" value="发送" ></td>
     <td><input type="reset" name="reset" value="重置" ></td>
    </tr>
   </table>
</form>
</body>
</html>


Sendmail.jsp
<%@ page contentType="text/html;charset=gb2312" language="java" %>
<%@ page import="com.email.*,com.tool.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>发送邮件测试</title>
<meta name="copyright" content="邮件发送测试. All rights reserved.">
<meta name="Keywords" content="jsp,servlet,mail">
<meta name="Description" content="发送邮件测试">
<meta http-equiv="content-type" content="text/html; charset=gb2312">
</head>
<body>
<%
String host = request.getParameter("host");
String user = request.getParameter("user");
String password = request.getParameter("password");
String subject = request.getParameter("subject");
subject = new ToChinese().getGB2312(subject);
String to = request.getParameter("to");
String from = request.getParameter("from");
String bodyashtml = request.getParameter("bodyashtml");
bodyashtml = new ToChinese().getGB2312(bodyashtml);
String attachfile = request.getParameter("attachfile");
attachfile = new ToChinese().getGB2312(attachfile);
out.println("<br>"+host);
out.println("<br>"+user);
//out.println("<br>"+password);
out.println("<br>"+subject);
out.println("<br>"+to);
out.println("<br>"+from);
out.println("<br>"+bodyashtml);//邮件内容
out.println("<br>"+attachfile);//邮件附件
try {
    SendMail send = new SendMail();
    send.setHost(host);
    //System.out.println(host);
    send.setUser(user);
    //System.out.println(user);
    send.setPass(password);
    //System.out.println(password);
    send.setSubject(subject);
    //System.out.println(subject);
    send.setTo(to);
    //System.out.println(to);
    send.setFrom(from);
    //System.out.println(from);
    send.setBodyAsHTML(bodyashtml);//以HTML形式存放内容
    //System.out.println(bodyashtml);
    send.addAttachFromFile(attachfile,"aa.txt");//附件路径,附件名称
    //System.out.println(attachfile);
    send.send();
    out.println("<br>邮件发送成功!!!");
   } catch (Exception e) {
    out.println("<br>"+e.getMessage());
    out.println("<br>邮件发送失败!!!");
   }
%>
</body>
</html>

工具类ToChinese.java
package com.tool;

public class ToChinese{
    public ToChinese() {}
    public String getGB2312(String s){
     if (s != null && !"".equals(s)) {
    try {
     s = new String(s.getBytes("8859_1"), "gb2312");
     return s;
    } catch (Exception ex) {
     System.out.print(ex.getMessage());
    }
   }
   return "";
    }
}