前言:
J2EE應用中涉及到發送郵件,通常采用javamail庫。
Part 1 安裝
安裝前要確保你的機子上安裝得有標準版的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 中。
注: 如果使用的是J2EE的SDK,不需要上面操做。
Part 2 基本類介紹
(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差不多).
Part 3 發送Html格式郵件示例,上傳附件使用了Oreilly 的MultpartRequest庫。

<%
@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
javamail2
</title>
</head>
<body bgcolor="#ffffff">
<h1>
利用javamail發送Html格式郵件
</h1>
<form name="SendMessage" method="POST" action="do_javamail2.jsp" enctype="multipart/form-data">
<p>
寄信人:<input type="text" name="From" size="30" maxlength="30" value="nobody_am@163.com"/>
</p>
<p>
收信人:<input type="text" name="To" size="30" maxlength="30" value="ming3232@21cn.com"/>
</p>
<p>
主題:<input type="text" name="Subject" size="30" maxlength="30" value="test"/>
</p>
<p>
附加文件:<input type="file" name="FileName" />
</p>
<p>
內容:<textarea name="Message" cols="40" rows="5">Hello</textarea>
</p>
<input type="submit" value="發送"/>
<input type="reset" value="清除"/>
</form>
</body>
</html>

<!-- Action File -->

<%
@ page contentType="text/html; charset=GBK" %>

<%
@ page import="java.util.*,java.io.*" %>

<%
@ page import="javax.mail.*" %>

<%
@ page import="javax.mail.internet.*" %>

<%
@ page import="javax.activation.*" %>

<%
@ page import="com.oreilly.servlet.MultipartRequest" %>

<%
!
InternetAddress[] address=null;
%>


<%
String mailserver="smtp.163.com"; //mail Server
String name="nobody_am"; //登錄名
String passwd="xxxx";

MultipartRequest multi=new MultipartRequest(request,"webapps/mailtest",5*1024*1024);

String From=multi.getParameter("From");
String To=multi.getParameter("To");
String Subject=multi.getParameter("Subject");
String messageText=multi.getParameter("Message");

String FileName;

if(multi.getFilesystemName("FileName")==null)
{
FileName=null;
}
else
{
FileName=multi.getFilesystemName("FileName");
}

boolean sessionDebug=true;

try{
java.util.Properties props=System.getProperties();

props.put("mail.host",mailserver);
props.put("mail.smtp.auth","true");//同時通過驗證

javax.mail.Session mailSession=javax.mail.Session.getInstance(props);
mailSession.setDebug(sessionDebug);

Message msg=new MimeMessage(mailSession);

msg.setFrom(new InternetAddress(From)); //From
address=InternetAddress.parse(To,false);
msg.setRecipients(Message.RecipientType.TO,address); //To
msg.setSubject(Subject); //Subject
msg.setSentDate(new Date()); //Date

if(FileName!=null)
{
File file=new File(FileName);

MimeBodyPart mbp1=new MimeBodyPart();
mbp1.setContent(messageText.toString(),"text/html");

MimeBodyPart mbp2=new MimeBodyPart();
FileDataSource fds=new FileDataSource(FileName);
mbp2.setDataHandler(new DataHandler(fds));
mbp2.setFileName(fds.getName());

Multipart mp=new MimeMultipart();
mp.addBodyPart(mbp1);
mp.addBodyPart(mbp2);
msg.setContent(mp);
msg.saveChanges(); //save msg
}
else
{
msg.setContent(messageText.toString(),"text/html");
}
Transport transport=mailSession.getTransport("smtp");
transport.connect(mailserver,name,passwd);//以smtp方式登錄郵箱
transport.sendMessage(msg,msg.getAllRecipients());
transport.close(); //close
out.println("郵件已順利傳送");
}catch(MessagingException mex)
{
mex.printStackTrace();
}
%>

后記: 使用的時候依據上述內容,自行封裝一個發送mail的類。