程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 利用Java實現電子郵件的批量發送

利用Java實現電子郵件的批量發送

編輯:關於JAVA

JAVA MAIL是利用現有的郵件賬戶發送郵件的工具,比如說,我在網易注冊一個郵箱賬戶,通過JAVA Mail的操控,我可以不親自登錄網易郵箱,讓程序自動的使用網易郵箱發送郵件。這一機制被廣泛的用在注冊激活和垃圾郵件的發送等方面。進行下載,並將mail.jar添加到classpath即可。如果你使用的是Java EE SDK,則可以在C:glassfishv3glassfishmodulesmail.jar找到所需的jar包,同樣需要添加的classpath。

Java郵件發送的大致過程是這樣的的:

1、構建一個繼承自Javax.mail.Authenticator的具體類,並重寫裡面的getPassWordAuthentication()方法。此類是用作登錄校驗的,以確保你對該郵箱有發送郵件的權利。

2、構建一個propertIEs文件,該文件中存放SMTP服務器地址等參數。

3、通過構建的propertIEs文件和javax.mail.Authenticator具體類來創建一個Javax.mail.Session。Session的創建,就相當於登錄郵箱一樣。剩下的自然就是新建郵件。

4、構建郵件內容,一般是Javax.mail.internet.MimeMessage對象,並指定發送人,收信人,主題,內容等等。

5、使用Javax.mail.Transport工具類發送郵件。

下面是我封裝的代碼,注釋也比較詳細。呼呼~~

1、首先是繼承自javax.mail.Authenticator的一個具體類。getPasswordAuthentication()方法也就是構建一個PassWordAuthentication對象並返回,有點費解JAVA Mail這樣的設計意圖,可能是Javax.mail.Authenticator為我們提供了附加的保證安全的驗證措施吧。

  1. package com.mzule.simplemail;
  2. import Javax.mail.Authenticator;
  3. import Javax.mail.PassWordAuthentication;
  4. /**
  5. * 服務器郵箱登錄驗證
  6. *
  7. * @author MZULE
  8. *
  9. */
  10. public class MailAuthenticator extends Authenticator {
  11. /**
  12. * 用戶名(登錄郵箱)
  13. */
  14. private String username;
  15. /**
  16. * 密碼
  17. */
  18. private String passWord;
  19. /**
  20. * 初始化郵箱和密碼
  21. *
  22. * @param username 郵箱
  23. * @param passWord 密碼
  24. */
  25. public MailAuthenticator(String username, String passWord) {
  26. this.username = username;
  27. this.password = passWord;
  28. }
  29. String getPassWord() {
  30. return passWord;
  31. }
  32. @Override
  33. protected PasswordAuthentication getPassWordAuthentication() {
  34. return new PasswordAuthentication(username, passWord);
  35. }
  36. String getUsername() {
  37. return username;
  38. }
  39. public void setPassword(String passWord) {
  40. this.password = passWord;
  41. }
  42. public void setUsername(String username) {
  43. this.username = username;
  44. }
  45. }

2、郵件發送類,剩下的步驟都是在這個類實現的。代碼中的SimpleMail是封裝了郵件主題和內容的一個POJO。覺得在一個方法參數中既包含主題又包含內容,不太合適,故重載了此方法。還有就是因為大多數郵箱的SMTP服務器地址都是可以通過郵箱地址算出來,簡單起見,提供了一個不需要SMTP服務器地址的構造器。

  1. package com.mzule.simplemail;
  2. import Java.util.List;
  3. import Java.util.PropertIEs;
  4. import Javax.mail.MessagingException;
  5. import Javax.mail.Session;
  6. import Javax.mail.Transport;
  7. import Javax.mail.internet.AddressException;
  8. import Javax.mail.internet.InternetAddress;
  9. import Javax.mail.internet.MimeMessage;
  10. import Javax.mail.internet.MimeMessage.RecipIEntType;
  11. /**
  12. * 簡單郵件發送器,可單發,群發。
  13. *
  14. * @author MZULE
  15. *
  16. */
  17. public class SimpleMailSender {
  18. /**
  19. * 發送郵件的props文件
  20. */
  21. private final transIEnt Properties props = System.getPropertIEs();
  22. /**
  23. * 郵件服務器登錄驗證
  24. */
  25. private transIEnt MailAuthenticator authenticator;
  26. /**
  27. * 郵箱session
  28. */
  29. private transIEnt Session session;
  30. /**
  31. * 初始化郵件發送器
  32. *
  33. * @param smtpHostName
  34. * SMTP郵件服務器地址
  35. * @param username
  36. * 發送郵件的用戶名(地址)
  37. * @param passWord
  38. * 發送郵件的密碼
  39. */
  40. public SimpleMailSender(final String smtpHostName, final String username,
  41. final String passWord) {
  42. init(username, passWord, smtpHostName);
  43. }
  44. /**
  45. * 初始化郵件發送器
  46. *
  47. * @param username
  48. * 發送郵件的用戶名(地址),並以此解析SMTP服務器地址
  49. * @param passWord
  50. * 發送郵件的密碼
  51. */
  52. public SimpleMailSender(final String username, final String passWord) {
  53. //通過郵箱地址解析出smtp服務器,對大多數郵箱都管用
  54. final String smtpHostName = "smtp." + username.split("@")[1];
  55. init(username, passWord, smtpHostName);
  56. }
  57. /**
  58. * 初始化
  59. *
  60. * @param username
  61. * 發送郵件的用戶名(地址)
  62. * @param passWord
  63. * 密碼
  64. * @param smtpHostName
  65. * SMTP主機地址
  66. */
  67. private void init(String username, String passWord, String smtpHostName) {
  68. // 初始化props
  69. props.put("mail.smtp.auth", "true");
  70. props.put("mail.smtp.host", smtpHostName);
  71. // 驗證
  72. authenticator = new MailAuthenticator(username, passWord);
  73. // 創建session
  74. session = Session.getInstance(props, authenticator);
  75. }
  76. /**
  77. * 發送郵件
  78. *
  79. * @param recipIEnt
  80. * 收件人郵箱地址
  81. * @param subject
  82. * 郵件主題
  83. * @param content
  84. * 郵件內容
  85. * @throws AddressException
  86. * @throws MessagingException
  87. */
  88. public void send(String recipIEnt, String subject, Object content)
  89. throws AddressException, MessagingException {
  90. // 創建mime類型郵件
  91. final MimeMessage message = new MimeMessage(session);
  92. // 設置發信人
  93. message.setFrom(new InternetAddress(authenticator.getUsername()));
  94. // 設置收件人
  95. message.setRecipient(RecipIEntType.TO, new InternetAddress(recipIEnt));
  96. // 設置主題
  97. message.setSubject(subject);
  98. // 設置郵件內容
  99. message.setContent(content.toString(), "text/Html;charset=utf-8");
  100. // 發送
  101. Transport.send(message);
  102. }
  103. /**
  104. * 群發郵件
  105. *
  106. * @param recipIEnts
  107. * 收件人們
  108. * @param subject
  109. * 主題
  110. * @param content
  111. * 內容
  112. * @throws AddressException
  113. * @throws MessagingException
  114. */
  115. public void send(List<String> recipIEnts, String subject, Object content)
  116. throws AddressException, MessagingException {
  117. // 創建mime類型郵件
  118. final MimeMessage message = new MimeMessage(session);
  119. // 設置發信人
  120. message.setFrom(new InternetAddress(authenticator.getUsername()));
  121. // 設置收件人們
  122. final int num = recipIEnts.size();
  123.  InternetAddress[] addresses = new InternetAddress[num];
  124. for (int i = 0; i <num; i++) {
  125. addresses[i] = new InternetAddress(recipIEnts.get(i));
  126. }
  127. message.setRecipients(RecipIEntType.TO, addresses);
  128. // 設置主題
  129. message.setSubject(subject);
  130. // 設置郵件內容
  131. message.setContent(content.toString(), "text/Html;charset=utf-8");
  132. // 發送
  133. Transport.send(message);
  134. }
  135. /**
  136. * 發送郵件
  137. *
  138. * @param recipIEnt
  139. * 收件人郵箱地址
  140. * @param mail
  141. * 郵件對象
  142. * @throws AddressException
  143. * @throws MessagingException
  144.  */
  145. public void send(String recipIEnt, SimpleMail mail)
  146. throws AddressException, MessagingException {
  147. send(recipIEnt, mail.getSubject(), mail.getContent());
  148. }
  149. /**
  150. * 群發郵件
  151. *
  152. * @param recipIEnts
  153. * 收件人們
  154. * @param mail
  155.  * 郵件對
  156.  * @throws AddressException
  157. * @throws MessagingException
  158. */
  159. public void send(List<String> recipIEnts, SimpleMail mail)
  160. throws AddressException, MessagingException {
  161. send(recipIEnts, mail.getSubject(), mail.getContent());
  162. }
  163. }

3、調用上面的郵箱發送器,可以構建一個工廠類,工廠類可以封裝創建的過程,所以通過讀配置文件獲取郵箱用戶名,密碼都會變得十分方便。下面的代碼是我在寫觀察者模式的時候寫的,只是簡單演示了工廠類。

  1.  package com.mzule.dp.observer.factory;
  2. import com.mzule.dp.observer.constant.MailSenderType;
  3. import com.mzule.simplemail.SimpleMailSender;
  4. /**
  5. * 發件箱工廠
  6. *
  7. * @author MZULE
  8. *
  9. */
  10. public class MailSenderFactory {
  11. /**
  12. * 服務郵箱
  13. */
  14. private static SimpleMailSender serviceSms = null;
  15. /**
  16. * 獲取郵箱
  17. *
  18. * @param type 郵箱類型
  19. * @return 符合類型的郵箱
  20. */
  21. public static SimpleMailSender getSender(MailSenderType type) {
  22. if (type == MailSenderType.SERVICE) {
  23. if (serviceSms == null) {
  24. serviceSms = new SimpleMailSender("[email protected]",
  25. "hidden");
  26. }
  27. return serviceSms;
  28. }
  29. return null;
  30. }
  31. }

4、發送郵件,還是觀察者模式DEMO裡面的代碼,呼呼。

  1. package com.mzule.dp.observer.observer;
  2. import Java.util.ArrayList;
  3. import Java.util.List;
  4. import Java.util.Observable;
  5. import Java.util.Observer;
  6. import Javax.mail.MessagingException;
  7. import Javax.mail.internet.AddressException;
  8. import com.mzule.dp.observer.constant.MailSenderType;
  9. import com.mzule.dp.observer.factory.MailSenderFactory;
  10. import com.mzule.dp.observer.po.Product;
  11. import com.mzule.simplemail.SimpleMailSender;
  12. public class ProductPriceObserver implements Observer {
  13. @Override
  14. public void update(Observable obj, Object arg) {
  15. Product product = null;
  16. if (obj instanceof Product) {
  17. product = (Product) obj;
  18. }
  19. if (arg instanceof Float) {
  20. Float price = (Float) arg;
  21.  Float decrease = product.getPrice() - price;
  22. if (decrease >0) {
  23. // 發送郵件
  24. SimpleMailSender sms = MailSenderFactory
  25. .getSender(MailSenderType.SERVICE);
  26. List<String> recipIEnts = new ArrayList<String>();
  27. recipIEnts.add("[email protected]");
  28. recipIEnts.add("[email protected]");
  29. try {
  30. for (String recipient : recipIEnts) {
  31. sms.send(recipIEnt, "價格變動", "您關注的物品"
  32. + product.getName() + "降價了,由"
  33. + product.getPrice() + "元降到" + price + "元,降幅達"
  34. + decrease + "元人民幣。趕快購物吧。");
  35. }
  36. } catch (AddressException e) {
  37. e.printStackTrace();
  38. } catch (MessagingException e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }
  43. }
  44. }

5、剩下的就是去查看郵件是否發送成功了。呼呼~~

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved