一、准備工作
首先你需要已一個發送郵箱,一般的郵箱都有SMTP、POP3服務,比如QQ郵箱,登陸QQ郵箱開啟SMTP服務,開啟是服務器會提示你設置獨立密碼,這個密碼是跟郵箱正常登陸的密碼不同的,這個是SMTP登陸要用的密碼,因此這里需記下SMTP獨立密碼,程序中會有使用。
(准備工作就是這么簡單,只需有一個開啟SMTP服務的郵箱即可);還需要一個JAR包(javax.mail.jar);java1.6里已經有了,如果沒有把jar包加上。下載地址:http://www.oracle.com/technetwork/java/javamail/index-138643.html
這里貼一下QQ郵箱設置SMTP的位置:登陸郵箱------點擊“設置”-------點擊“賬戶”標簽頁,往下翻就可以看到如下界面

二、一般情況下發送郵件只是中間操作,所以可以使用多線程,開啟一個新線程發送郵件,主程序可以繼續往下執行。
1 import java.util.Properties; 2 3 import javax.mail.Authenticator; 4 import javax.mail.MessagingException; 5 import javax.mail.PasswordAuthentication; 6 import javax.mail.Session; 7 import javax.mail.Transport; 8 import javax.mail.Message.RecipientType; 9 import javax.mail.internet.InternetAddress; 10 import javax.mail.internet.MimeMessage; 11 12 public class SendMailThread extends Thread{ 13 14 private String mailAdr; 15 private String content; 16 private String subject ; 17 18 public SendMailThread(String mailAdr, String subject, String content) { 19 super(); 20 this.mailAdr = mailAdr; 21 this.content = content; 22 this.subject = subject; 23 } 24 25 @Override 26 public void run() { 27 // TODO Auto-generated method stub 28 super.run(); 29 sendMail(mailAdr,subject,content); 30 } 31 32 /* 33 * mailAdr 收件人地址 34 * subject 郵件標題 35 * content 郵件文本內容 36 */ 37 public void sendMail(String mailAdr,String subject,String content){ 38 //配置發送郵件的環境屬性 39 final Properties props = new Properties(); 40 // 表示SMTP發送郵件,需要進行身份驗證 41 props.put("mail.smtp.auth", "true"); 42 props.put("mail.smtp.host", "smtp.qq.com"); 43 //smtp登陸的賬號、密碼 ;需開啟smtp登陸 44 props.put("mail.user", "XXXXX@qq.com"); 45 // 訪問SMTP服務時需要提供的密碼,不是郵箱登陸密碼,一般都有獨立smtp的登陸密碼 46 props.put("mail.password", "XXXXX"); 47 48 // 構建授權信息,用於進行SMTP進行身份驗證 49 Authenticator authenticator = new Authenticator() { 50 @Override 51 protected PasswordAuthentication getPasswordAuthentication() { 52 // 用戶名、密碼 53 String userName = props.getProperty("mail.user"); 54 String password = props.getProperty("mail.password"); 55 return new PasswordAuthentication(userName, password); 56 } 57 }; 58 59 // 使用環境屬性和授權信息,創建郵件會話 60 Session mailSession = Session.getInstance(props, authenticator); 61 // 創建郵件消息 62 MimeMessage message = new MimeMessage(mailSession); 63 // 設置發件人 64 try{ 65 InternetAddress form = new InternetAddress( 66 props.getProperty("mail.user")); 67 message.setFrom(form); 68 69 // 設置收件人 70 InternetAddress to = new InternetAddress(mailAdr); 71 message.setRecipient(RecipientType.TO, to); 72 73 // 設置抄送 74 //InternetAddress cc = new InternetAddress("luo_aaaaa@yeah.net"); 75 //message.setRecipient(RecipientType.CC, cc); 76 77 // 設置密送,其他的收件人不能看到密送的郵件地址 78 //InternetAddress bcc = new InternetAddress("aaaaa@163.com"); 79 //message.setRecipient(RecipientType.CC, bcc); 80 81 // 設置郵件標題 82 message.setSubject(subject); 83 // 設置郵件的內容體 84 message.setContent(content, "text/html;charset=UTF-8"); 85 // 發送郵件 86 Transport.send(message); 87 }catch(MessagingException e){ 88 e.printStackTrace(); 89 } 90 } 91 92 public static void main(String[] args) { 93 // TODO Auto-generated method stub 94 SendMailThread d = new SendMailThread("xxxxxxx@qq.com","測試郵件標題","測試郵件001 <br>內容...."); 95 d.start(); 96 System.out.println("程序繼續..."); 97 } 98 99 }
三、主程序中調用
SendMailThread mail = new SendMailThread("郵件地址","郵件標題","郵件內容"); mail.start();
//群發方式一,用數組 InternetAddress[] adds = new InternetAddress[2]; adds[0] = new InternetAddress("xxxx@qq.com"); adds[1] = new InternetAddress("xxxx@qq.com"); message.setRecipients(RecipientType.TO, adds); //群發方式二,直接用String多個地址有逗號隔開 message.setRecipients(RecipientType.TO, "xxxxx@qq.com,xxxxx@qq.com");
props.put("mail.smtp.host", "smtp.163.com");
不過,經測試發現網易的好像只能發送到網易郵箱,其他郵箱發不到,QQ郵箱就可以發送到其他任何郵箱去。
// 可以從控制台中看一下服務器的響應信息 mailSession.setDebug(true);
補充04:
上面群發的郵件是指郵件內容是相同的,群發給多個人。
另外一種情況是,多份不同的郵件群發,項目中就有遇到這種情況,群發給員工角色的郵件格式與群發給管理層角色郵件格式不同,所以自然會想到每種郵件啟動一個上面代碼中的線程,但是發送2種郵件還好,只需要啟動兩個線程,如果是100種郵件呢,會直接把JVM內存占滿導致tomcat掛掉,所以應該考慮把循環都寫到一個線程里面,這樣只需要建立一個線程就可以完成,也節約了系統資源的占用。
在線程外面先把郵件封裝好,每個郵件用一個Map來裝,然后把Map再裝到List里面,然后在發送郵件線程里遍歷發送。
修改之后的線程如下:
1 package com.linwei.util; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 import java.util.Properties; 8 9 import javax.mail.Authenticator; 10 import javax.mail.MessagingException; 11 import javax.mail.PasswordAuthentication; 12 import javax.mail.Session; 13 import javax.mail.Transport; 14 import javax.mail.Message.RecipientType; 15 import javax.mail.internet.InternetAddress; 16 import javax.mail.internet.MimeMessage; 17 18 import org.apache.log4j.Logger; 19 20 public class SendMailThread extends Thread{ 21 22 /* 23 * @param list 24 * 存放郵件地址、標題、內容的list集合 25 * key: mailAdr,subject,content 26 */ 27 private List<Map<String,String>> list ; 28 private static final Logger log = Logger.getLogger(SendMailThread.class); 29 30 public SendMailThread(List<Map<String,String>> list){ 31 super(); 32 this.list = list ; 33 } 34 public SendMailThread(List<Map<String,String>> list,int days){ 35 super(); 36 this.list = list ; 37 } 38 39 @Override 40 public void run() { 41 // TODO Auto-generated method stub 42 super.run(); 43 if(list!=null && list.size()>0){ 44 sendMail(list); 45 } 46 } 47 48 /* 49 * mailAdr 收件人地址,多個收件地址用,隔開 50 * content 郵件文本內容 51 */ 52 public void sendMail(List<Map<String,String>> list){ 53 final Properties props = new Properties(); 54 props.put("mail.smtp.auth", "true"); 55 props.put("mail.smtp.host", "smtp.sina.com"); 56 //smtp登陸 57 props.put("mail.user", "test@sina.com"); 58 props.put("mail.password", "test123456"); 59 60 // 構建授權信息,用於進行SMTP進行身份驗證 61 Authenticator authenticator = new Authenticator() { 62 @Override 63 protected PasswordAuthentication getPasswordAuthentication() { 64 // 用戶名、密碼 65 String userName = props.getProperty("mail.user"); 66 String password = props.getProperty("mail.password"); 67 return new PasswordAuthentication(userName, password); 68 } 69 }; 70 71 // 使用環境屬性和授權信息,創建郵件會話 72 Session mailSession = Session.getInstance(props, authenticator); 73 //mailSession.setDebug(true); 74 75 try{ 76 MimeMessage message = null ; // 創建郵件消息 77 InternetAddress form = null ; //發件郵箱 78 79 log.error("***************郵件發送線程開始****************"+list.size()); 80 for(Map<String,String> map : list){ //開始遍歷 81 message = new MimeMessage(mailSession); 82 form = new InternetAddress(props.getProperty("mail.user")); 83 message.setFrom(form); 84 // 設置收件人 85 message.setRecipients(RecipientType.TO, map.get("mailAdr")); // 支持群發,多地址用逗號分隔 86 // 設置郵件標題 87 message.setSubject(map.get("subject")); 88 // 設置郵件的內容體 89 message.setContent(map.get("content"), "text/html;charset=UTF-8"); 90 // 發送郵件 91 Transport.send(message); 92 } 93 }catch(MessagingException e){ 94 log.error("發送郵件出現異常!"+e.toString()); 95 e.printStackTrace(); 96 } 97 } 98 99 public static void main(String[] args) { 100 101 Map<String,String> map01 = new HashMap<String,String>(); 102 map01.put("mailAdr", "xxx@qq.com"); 103 map01.put("subject", "發送郵件方式修改測試001"); 104 map01.put("content", "abcfajglejgle"); 105 Map<String,String> map02 = new HashMap<String,String>(); 106 map02.put("mailAdr", "xxxxx@qq.com,wewe@qq.com"); 107 map02.put("subject", "發送郵件方式修改測試002"); 108 map02.put("content", "zzzzzzzzzzzzzzzzzzz"); 109 110 List<Map<String,String>> list = new ArrayList<Map<String,String>>(); 111 list.add(map01); 112 list.add(map02); 113 new SendMailThread(list).start(); 114 System.out.println("程序繼續..."); 115 } 116 117 }
