首先應該構建JavaMail的開發環境,在JDK中配置JavaMail的相關類和包。在構建JavaMail開發環境中,需要mail.jar和activation.jar這兩個文件。這兩個文件的獲得可以通過SUN公司的官方網站下載。
JavaMail對STMP、POP3、IMAP提供支持,封裝了電子郵件功能中的郵件對象、發送、身份驗證、接收等功能。
在發送各種類型的郵件時,主要應用到下面幾個類:
1)Session類。用戶要想發送郵件首先需要創建Session類的對象,利用這個對象創建郵件對象、指定郵件服務器認證的客戶端屬性。它的類層次為javax.mail.Session。
2)InternetAddress類。郵件發送的地址類,類層次結構是javax.mail.internet.InternetAddress,它繼承自抽象類javax.mail.Address。
3)MimeMessage類。郵件消息類,它的類層次結構是javax.mail.internet.MimeMessage,繼承自抽象類javax.mail.Message。
4)Transport類。郵件發送類,它的類層次結構是javax.mail.Transport。
5)Authenticator類。授權者類,JavaMail通過使用Authenticator類以用戶名、密碼的方式訪問那些受到保護的資源,在這裏“資源”就是郵件服務器。其類層次結構為javax.mail.Authenticator。
6)Store類。用來從郵件服務器上接受郵件,其類層次結構為javax.mail.Store。
7)Folder類。郵件文件夾類,它的類層次結構為javax.mail.Folder。
實現過程:
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.mail.*"%>
<%@ page import="javax.mail.internet.*"%>
<%@ page import="javax.activation.*"%>
<%
try{
request.setCharacterEncoding("gb2312");
String from = request.getParameter("jname");
String to = request.getParameter("sname");
String subject = request.getParameter("title");
String messageText = request.getParameter("message");
String password = request.getParameter("password");
String S = request.getParameter("jname");
int n = S.indexOf('@');
int m = S.length();
String server = S.substring(n+1,m);
//建立郵件會話
Properties pro = new Properties();
pro.put("mail.smtp.host","smtp."+server);
pro.put("mail.stmp.auth","true");
Session sess = Session.getInstance(pro);
sess.setDebug(true);
MimeMessage message = new MimeMessage(mess);//新建壹個消息對象
//設置發件人
InternetAddress from_mail = new InternetAddress(from);
message.setFrom(from_mail);
//設置收件人
InternetAddress to_mail = new InternetAddress(to);
message.setRecipient(Message.RecipientType.TO,to_mail);
message.setSubject(subject);//設置主題
message.setText(messageText);//設置內容
message.setSentDate(new Date());//設置發送時間
//發送郵件
message.saveChanges();//保存郵件信息
Transport transport = sess.getTransport("smtp");
transport.connect("smtp."+server,from,password);
transport.sendMessage(message,message.getAllRecipients());
transport.close();
out.print("郵件發送成功");
}catch(Exception e){
out.print("發送郵件失敗,原因可能是<ul>");
out.println(e.getMessage());
}
%>
2.發送HTML格式的郵件
MimeMultipart對象來存儲HTML文件的具體內容,在設置內容的同時應該設置對象的格式。
MimeMultipart類的類層次結構是javax.mail.Internet.MimeMultipart。壹般保存電子郵件內容的容器是Multipart抽象類,它定義了增加、刪除及獲得電子郵件不同內容的方法。由於Multipart是抽象類,所以必須使用壹個具體的子類,JavaMail API提供javax.mail.Internet.MimeMultipart類來使用MimeMessage對象。
語法:
Multipart mul = new MimeMultipart();
說明:使用MimeMultipart對象時常用的壹個方法是addBodyPart(),它可以在電子郵件的內容裏添加BodyPart對象,消息可以有很多部分,壹個BodyPart可以代表壹個部分。
MimeBodyPart類的類層次結構是javax.mail.Internet.MimeBodyPart。MimeBodyPart是BodyPart具體於MimeMessage的壹個子類。MimeBodyPart對象代表壹個MimeMessage對象內容的壹部分,每個MimeBodyPart被認為由兩部分組成:壹個MIME類型和匹配這個類型的內容。
語法:
BodyPart mdp = new MimeBodyPart();//新建壹個存放信件內容的BodyPart對象
String messageText = "Hello World!";
//定義MIME類型為text/html,並設置MimeBodyPart的內容
mdp.setContent(messageText,"text/html");
實現過程:
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.mail.*"%>
<%@ page import="javax.mail.internet.*"%>
<%@ page import="javax.activation.*"%>
<%
try{
request.setCharacterEncoding("gb2312");
String from_mail = request.getParameter("sname");
String to_mail = request.getParameter("rname");
String subject = request.getParameter("title");
String messageText = request.getParameter("message");
String password = request.getParameter("password");
String S = request.getParameter("sname");
int n = S.indexOf('@');
int m = S.length();
String server = S.substring(n+1,m);
Properties prop = new Properties();
prop.put("mail.smtp.host","smtp."+server);
prop.put("mail.smtp.auth","true");
Session sess = Session.getInstance(prop);
sess.setDebug(true);
MimeMessage message = new MimeMessage(sess);
//給消息對象設置收件人、發件人、主題、發信時間
InternetAddress from = new InternetAddress(from_mail);
message.setFrom(from);
InternetAddress to = new InternetAddress(to_mail);
message.setRecipient(Message.RecipientType.TO,to);
message.setSubject(subject);
message.setSentDate(new Date());
Multipart mul = new Multipart();//新建壹個MimeMultipart對象來存放多個BodyPart對象
BodyPart mdp = new MimeBodyPart();//新建壹個存放信件內容的BodyPart對象
mdp.setContent(messageText,"text/html;charset=gb2312");
mul.addBodyPart(mdp);//將含有信件內容的BodyPart加入到MimeMultipart對象中
message.saveChanges();
Transport transport = sess.getTransport("smtp");
transport.connect("smtp."+server,from_mail,password);
transport.sendMessage(message,message.getAllRecipients());
transport.close();
out.println("郵件發送成功!");
}catch(Exception e){
out.print("發送郵件失敗,原因可能是<ul>");
out.println(e.getMessage());
}
%>
3.帶附件的郵件發送
壹般,在設計帶有附件的郵件發送程序時可以遵循以下步驟:
1)發送帶有附件的郵件需要建立郵件的各個郵件體部分,在第壹個部分(即郵件內容文字)後增加壹個具有DataHandler的附件。
2)如果將文件作為附件發送,則要建立FileDataSource類型的對象作為附件數據源;如果從URL讀取數據作為附件發送,則要建立URLDataSource類型的對象作為附件數據源。
3)將數據源(FileDataSource或是URLDataSource)對象作為DataHandler類的構造方法的參數傳入,從而建立壹個DataHandler對象作為數據源的DataHandler。
4)將這個DataHandler設置為郵件體部分的DataHandler,這樣就完成了郵件體與附件之間的關聯工作。下面的工作就是用BodyPart的setFileName()方法設置附件名為原文件名。
5)將兩個郵件體放入到Multipart,設置郵件內容為這個容器的Multipart,發送郵件。
實現過程:
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.mail.*"%>
<%@ page import="javax.mail.internet.*"%>
<%@ page import="javax.activation.*"%>
<%@ page import="java.net.*"%>
<%
try{
request.setCharacterEncoding("gb2312");
String from_mail = request.getParameter("sname");
Stirng to_mail = request.getParameter("rname");
String from_psd = request.getParameter("password");
String title = request.getParameter("title");
String content = request.getParameter("content");
String path = request.getParameter("attachement");
String S = request.getParameter("sname");
int n = S.indexOf('@');
int m = S.length();
String server = S.substring(n+1,m);
Properties prop = new Properties();
prop.put("mail.smtp.host","smtp."+server);
prop.put("mail.smtp.auth","true");
Session sess = Session.getInstance(prop);
session.setDebug(true);
MimeMessage message = new MimeMessage(sess);
//給消息對象設置收件人、發件人、主題
InternetAddress from = new InternetAddress(from_mail);
message.setFrom(from);
InternetAddress to = new InternetAddress(to_mail);
message.setRecipient(Message.RecipientType.TO,to);
message.setSubject(title);
Multipart mul = new MimeMultipart();//新建壹個MimeMultipart對象來存放多個BodyPart對象
BodyPart mdp = new MimeBodyPart();//新建壹個存放信件內容的BodyPart對象
mdp.setContent(content,"text/html;charset=gb2312");
mul.addBodyPart(mdp);//將含有信件內容的BodyPart加入到MimeMultipart對象中
//設置信件的附件
mdp = new MimeBodyPart();//新建壹個存放附件的BodyPart
DataHandler handler = new DataHandler("JAVAMAIL附件測試","text/plain;charset=gb2312");//新建壹個DataHandler對象,並設置其內容、格式和編碼方式
mdp.setFileName("mrsoft");//可以和源文件名不壹致
mdp.setDataHandler(handler);
mul.addBodyPart(mdp);
message.setContent(mul);//把mul作為消息對象的內容
message.saveChanges();
Transport transport = sess.getTransport("smtp");
transport.connect("smtp."+server,from_mail,from_psd);
transport.sendMessage(message,message.getAllRecipients());
transport.close();
out.println("附件發送成功!");
}catch(Exception ex){
out.print("郵件發送失敗,原因可能是:<ul>");
out.println(ex.getMessage());
}
%>
4.郵件群發
將收件人的地址設置為tomail+i的形式,利用For循環向這些地址發送郵件,以實現群發的目的。
利用Address類設置郵件信息的收件人和發件人信息,在創建了郵件地址類後,通過message的setFrom()方法設置郵件的發件人,代碼如下:
message.setFrom(from_mail);
設置收件人地址時使用setRecipient()方法設置收信人地址,代碼如下:
message.setRecipient(type,address);
參數type為收件人類型。可以使用以下3個常量來區分收件人的類型:
1)Message.RecipientType.TO--發送。
2)Message.RecipientType.CC--抄送。
3)Message.RecipientType.BCC--暗送。
說明:在日常的使用中,經常會用到抄送和暗送這兩種形式的郵件發送。抄送和暗送雖然都是將壹封E-mail同時發送到多個信箱,但是它們之
間有壹定的區別的,其區別在於暗送隱藏了其他抄送人的地址,只讓收信人看到自己的收信地址,可以起到保密和預防垃圾郵件的作用。
實現過程:
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.mail.*"%>
<%@ page import="javax.mail.internet.*"%>
<%@ page import="javax.activation.*"%>
<%
try{
int i = 1;
for(i=1;i<4;i++){
request.setCharacterEncoding("gb2312");
String from = request.getParameter("from_mail");
String to = request.getParameter("tomail"+i);
String subject = request.getParameter("subject");
String messageText = request.getParameter("message");
String password = request.getParameter("password");
String S = request.getParameter("from_mail");
int n = S.indexOf('@');
int m = S.length();
String server = S.substring(n+1,m);
//建立郵件會話
Properties pro = new Properties();
pro.put("mail.smtp.host","smtp."+server);
pro.put("mail.smtp.auth","true");
Session sess = Session.getInstance(pro);
sess.setDebug(true);
MimeMessage message = new MimeMessage(sess);//新建壹個消息對象
InternetAddress from_mail = new InternetAddress(from);//設置發件人
message.setFrom(from_mail);
//設置收件人
InternetAddress to = new InternetAddress(to);
message.setRecipient(Message.RecipientType.TO,to_mail);
message.setSubject(subject);//設置主題
message.setText(messageText);//設置內容
message.setSentDate(new Date());//設置發送時間
message.saveChanges();//保存郵件信息
Transport transport = sess.getTransport("smtp");
transport.connect("smtp."+server,from,password);
transport.sendMessage(message,message.getAllRecipients());
transport.close();
if(i==3){
out.print("發送郵件成功");
}
}
}catch(Exception e){
out.print("發送郵件失敗,原因可能是<ul>");
out.println(e.getMessage());
}
%>
5.Spring利用WebService發送手機短信
通過編程實現短信息的發送是壹件比較繁瑣的事情,目前壹般的解決方法是通過計算機和手機的連線,使用手機編程語言編寫相關的短信程序,而這種方法不僅需要耗費時間和精力,還需要有相應的硬件設施,並且必須懂得手機編程的相關知識。可以通過Web Service技術遠程訪問現有的短信發送服務器,並通過調用服務器的方法來發送短信。
技術要點:
利用現有資源:壹個可發送短信的Web Service遠程服務。這個Web Service是新浪網站提供的,它可供用戶直接調用遠程服務來發送消息。這個服務的服務名稱是SMSWS,服務端口是SMSWebServiceSoapPort。在這個遠程服務中提供了壹個發送短消息的方法sendXml()。此方法的定義如下:
public String sendXml(String carrier,String id,String password,String toMobile,String message,String msgtype)
功能:根據用戶給定的參數發送短信到目標用戶的手機中。
參數說明:
sendXml()方法中的6個參數均為String類型,sendXml()方法的返回值也是String類型。以下是sendXml()方法中的6個參數的具體說明。
1)carrier:運營商名稱,具體使用時此參數並沒有什麽具體要求,即這裏面可以隨便輸入,輸入的字符串不會在對方手機中有任何顯示。
2)id:在新浪網上註冊的手機號。使用新浪服務發送手機短信時,需要在新浪網站上進行手機註冊,註冊網址為:。
3)password:在新浪網成功註冊手機後,新浪網所反饋來的密碼。
4)toMobile:對方接收短信的手機號碼。
5)message:所要發送短消息的內容。
6)msgtype:發送短消息的類型,由於發送的不是彩信,所以輸入Text。
調用sendXml()方法需在Spring中配置JaxRpcPortProxyFactoryBean的實例,然後定義包含此方法的接口,Spring會自動獲得遠程服務的接口。
實現過程:
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
SMSWebService sendSms = (SMSWebService)ac.getBean("helloWorldService");
String carrier = "lzwsky";
String id = userid.getText();
String password = passwordField.getText();
String toMobile = toMobileField.getText();
String message = messageField.getText();
String msgtype = "Text";
sendSms.sendXml(carrier,id,password,toMobile,message,msgtype);