JAVA與JavaMail郵件發送

2008年11月18日 星期二 14:15

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("[email protected]");


(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("[email protected]");
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("[email protected]");
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("[email protected]");
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("[email protected]");
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("[email protected]");
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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章