用JavaMailAPI編寫可帶附件的郵件發送程序
利用Sun公司提供的JavaMail API可以很方便的開發郵件發送程序。也許你已經可以利用它來發送一段簡單的文本了,但想不想使你的程序像OUTLOOK一樣也能發送附件呢?本文在簡單介紹了JavaMail之后,詳細講解了一段完整的送信的JavaBean及一個十分輕巧的servlet。
(沒有裝載JavaMail API的讀者,可以到此站點下載,并按照Readme.txt設置好ClassPath)
一、JavaMail中一些我們需要的類
1.Properties
JavaMail需要Properties來創建一個session對象,其屬性值就是發送郵件的主機,如:
2.Session
所有的基于JavaMail的程序都至少需要一個或全部的對話目標。
3.MimeMessage
信息對象將把你所發送的郵件真實的反映出來。
4.Transport
郵件的發送是由Transport來完成的:
二、我們自己創建的可發送附件的類
三、一個簡單的servlet
四、小結
至此,你已經可以在郵件中添加附件了,而且可以是多個。像這樣,將響應與邏輯相分離對代碼的擴展和維護是相當有好處的。若Beans與servlet不在同一個包下,別忘了“import”。
(沒有裝載JavaMail API的讀者,可以到此站點下載,并按照Readme.txt設置好ClassPath)
一、JavaMail中一些我們需要的類
1.Properties
JavaMail需要Properties來創建一個session對象,其屬性值就是發送郵件的主機,如:
| Properties props = new Properties (); props.put("mail.smtp.host", "smtp.xxxx.com");//可以換上你的smtp主機名,就像你在OutLook中設置smtp主機名一樣。 |
2.Session
所有的基于JavaMail的程序都至少需要一個或全部的對話目標。
| Session session = Session.getInstance(props, null); |
3.MimeMessage
信息對象將把你所發送的郵件真實的反映出來。
| MimeMessage msg = new MimeMessage(session); |
4.Transport
郵件的發送是由Transport來完成的:
| Transport.send(msg); |
二、我們自己創建的可發送附件的類
| import java.util.* ; import java.io.* ; import javax.mail.* ; import javax.mail.internet.* ; import javax.activation.* ; public class Mail { //定義發件人、收件人、主題等 String to=""; String from=""; String host=""; String filename=""; String subject=""; //用于保存發送附件的文件名的集合 Vector file = new Vector(); //做一個可以傳發件人等參數的構造 public Mail (String to,String from,String smtpServer,String subject){ //初始化發件人、收件人、主題等 this.to=to; this.from=from; this.host=smtpServer; this.subject=subject; } //該方法用于收集附件名 public void attachfile(String fname){ file.addElement(fname); } //開始發送信件的方法 public boolean startSend(){ //創建Properties對象 Properties props = System.getProperties(); //創建信件服務器 props.put("mail.smtp.host", host); //得到默認的對話對象 Session session=Session.getDefaultInstance(props, null); try { //創建一個消息,并初始化該消息的各項元素 MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(from)); InternetAddress[] address={new InternetAddress(to)}; msg.setRecipients(Message.RecipientType.TO,address); msg.setSubject(subject); //后面的BodyPart將加入到此處創建的Multipart中 Multipart mp = new MimeMultipart(); //利用枚舉器方便的遍歷集合 Enumeration efile=file.elements(); //檢查序列中是否還有更多的對象 while(efile.hasMoreElements()){ MimeBodyPart mbp=new MimeBodyPart(); //選擇出每一個附件名 filename=efile .nextElement().toString(); //得到數據源 FileDataSource fds=new FileDataSource(filename); //得到附件本身并至入BodyPart mbp.setDataHandler(new DataHandler(fds)); //得到文件名同樣至入BodyPart mbp.setFileName(fds.getName()); mp.addBodyPart(mbp); } //移走集合中的所有元素 file.removeAllElements(); //Multipart加入到信件 msg.setContent(mp); //設置信件頭的發送日期 msg.setSentDate(new Date()); //發送信件 Transport.send(msg); } catch (MessagingException mex) { mex.printStackTrace(); Exception ex = null; if ((ex=mex.getNextException())!=null){ ex.printStackTrace(); } return false; } return true; } } |
三、一個簡單的servlet
| import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class SendMail extends HttpServlet implements SingleThreadModel{ public void init(ServletConfig Conf) throws ServletException { super.init(Conf); } public void doPost(HttpServletRequest Req, HttpServletResponse Res) throws ServletException, IOException { try{ //實例化剛才我們做的類,并按其構造傳進相應的參數 Mail sendmail=newMail("[email protected]", "[email protected]","smtp.21cn.com","test"); sendmail.attachfile("table.pdf"); sendmail.startSend(); }catch(Exception e){ e.printStackTrace(); } } public void destroy() { } } |
四、小結
至此,你已經可以在郵件中添加附件了,而且可以是多個。像這樣,將響應與邏輯相分離對代碼的擴展和維護是相當有好處的。若Beans與servlet不在同一個包下,別忘了“import”。