java實現smtp郵件發送


一、准備工作

     首先你需要已一個發送郵箱,一般的郵箱都有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();
 
補充01:
上面程序中是單個收件接收人,如果需要群發郵件可自行修改程序,下面貼出群發郵件的方法
//群發方式一,用數組
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");
 
補充02:
上面程序是演示用QQ郵箱發送,也可以用網易等其他郵箱,修改這句即可:
props.put("mail.smtp.host", "smtp.163.com");

不過,經測試發現網易的好像只能發送到網易郵箱,其他郵箱發不到,QQ郵箱就可以發送到其他任何郵箱去。

 

補充03:
程序調試時可打印發送信息用於查找問題;
創建郵件回話session后加上這條語句:
// 可以從控制台中看一下服務器的響應信息 
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 }

 

 

以上內容參考來自網絡,自己整理如上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM