????? 關于這個工具的創(chuàng)作:相信大家都有找工作的經歷,在簡歷投遞的時候是否有這樣的煩惱?點對點的發(fā)送郵件時,不停的復制粘貼自己的簡歷發(fā)送,在這一期間不僅浪費了大家相當多的一部分時間,而且發(fā)送簡歷的效率也不是很高。于是自己便做了一個這樣的小工具,能夠進行批量、群發(fā)郵件的功能。
??????一、開發(fā)前準備:
????? 必要的jar包:mail.jar、commons-email-1.1.jar、activation.jar
?????
???? 二、代碼編寫:
???? MailSenderInfo.java? 封裝Mail普通dojo類
???
package cn.com.mes.mail; import java.util.Date; /** * 封裝郵件發(fā)送對象類 * @author HuangXiaoyong */ public class MailSenderInfo { //郵件登錄賬號 private String username = ""; //郵件登錄密碼 private String password = ""; //郵件服務器地址 private String hostName = ""; //發(fā)件人郵箱地址 private String from = ""; //郵件標題 private String title = ""; //要發(fā)送Html文本路徑 private String htmlPath = ""; //發(fā)送時間 private Date sendDate = null; public MailSenderInfo (){ } public MailSenderInfo(String username, String password, String hostName, String from, String title) { super(); this.username = username; this.password = password; this.hostName = hostName; this.from = from; this.title = title; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getHostName() { return hostName; } public void setHostName(String hostName) { this.hostName = hostName; } public String getFrom() { return from; } public void setFrom(String from) { this.from = from; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getHtmlPath() { return htmlPath; } public void setHtmlPath(String htmlPath) { this.htmlPath = htmlPath; } public Date getSendDate() { return sendDate; } public void setSendDate(Date sendDate) { this.sendDate = sendDate; } }
?
?? 2.MailUtils郵件發(fā)送工具類
package cn.com.mes.mail; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Properties; /** * 郵件發(fā)送工具類 * @author HuangXiaoyong */ public class MailUtils { //郵件服務器地址 public static final String EMAIL_HOST = "email.host"; //郵箱登錄賬號 public static final String EMAIL_USERNAME ="email.username"; //郵箱登錄密碼 public static final String EMAIL_PASSWORD ="email.password"; //發(fā)送郵件標題 public static final String EMAIL_TITLE ="email.title"; //發(fā)件人郵箱地址 public static final String EMAIL_FROM = "email.from"; //發(fā)送Html簡歷路徑 public static final String EMAIL_HTML_PATH = "email.html.path"; //發(fā)送簡歷時間 public static final String EMAIL_SEND_DATE = "email.senddate"; //收件人郵箱地址 public static final String EMAIL_TO = "email.to"; public static void main(String[] args) throws Exception{ } private static List<String> mailAddList = new ArrayList<String>(); /** * 將某個日期以yyyy-MM-dd HH:mm:ss格式轉化成字符串 * @param date * @return str */ public static String formatDateToString(Date date) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String str = sdf.format(date); return str; } /** * 將日期字符串轉化成Date對象 * @param strDate * @return */ public static Date formatStringToDate(String strDate){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = null; try{ date = sdf.parse(strDate); }catch(Exception ex){ ex.printStackTrace(); } return date; } /** * 設置郵件屬性 * @param mailInfo * @return */ public static boolean setEMailProperties(MailSenderInfo mailInfo){ boolean flag = false; Properties props = new Properties(); try{ props.load(new FileInputStream(System.getProperty("user.dir")+"\\mail.properties")); props.setProperty(EMAIL_HOST, mailInfo.getHostName()); props.setProperty(EMAIL_USERNAME, mailInfo.getUsername()); props.setProperty(EMAIL_PASSWORD, mailInfo.getPassword()); props.setProperty(EMAIL_TITLE, mailInfo.getTitle()); props.setProperty(EMAIL_FROM, mailInfo.getFrom()); props.setProperty(EMAIL_HTML_PATH, mailInfo.getHtmlPath()); props.setProperty(EMAIL_SEND_DATE, formatDateToString(mailInfo.getSendDate())); FileOutputStream fos = new FileOutputStream(System.getProperty("user.dir")+"\\mail.properties"); props.store(fos, ""); fos.close(); flag = true; }catch(Exception ex){ ex.printStackTrace(); } return flag; } /** * 獲取郵件屬性 * @return */ public static MailSenderInfo getMailSenderInfo(){ MailSenderInfo mailInfo = new MailSenderInfo(); Properties props = new Properties(); try{ props.load(new FileInputStream(System.getProperty("user.dir")+"\\mail.properties")); }catch(Exception ex){ ex.printStackTrace(); } mailInfo.setHostName(props.getProperty(EMAIL_HOST)); mailInfo.setUsername(props.getProperty(EMAIL_USERNAME)); mailInfo.setPassword(props.getProperty(EMAIL_PASSWORD)); mailInfo.setFrom(props.getProperty(EMAIL_FROM));; mailInfo.setSendDate(formatStringToDate(props.getProperty(EMAIL_SEND_DATE))); mailInfo.setTitle(props.getProperty(EMAIL_TITLE)); mailInfo.setHtmlPath(props.getProperty(EMAIL_HTML_PATH)); return mailInfo; } /** * 收件人的數(shù)目 * @return */ public static int getToCounts(){ return mailAddList.size(); } /** * 獲取發(fā)送郵件列表從指定的文件中 * @param path * @return */ public static List<String> getToList(String path){ String strEMailAdd = ""; try{ //從文件中讀取抓取的電子郵件 strEMailAdd = getStringBufferText(path); }catch(Exception ex){ ex.printStackTrace(); } //將讀取的郵件地址字符串分割,添加到List集合中 String[] strLists = strEMailAdd.split(","); for(String list : strLists){ mailAddList.add(list); } return mailAddList; } /** * 獲取指定文件的內容 * * @param path 要讀取文件的路徑 * @return * @throws Exception */ public static String getStringBufferText(String path){ StringBuffer sbf = new StringBuffer(); FileReader read = null; BufferedReader br = null; try{ read = new FileReader (path); br = new BufferedReader(read); String info = null; while((info = br.readLine())!=null) { sbf.append(info); } }catch(Exception ex){ ex.printStackTrace(); }finally{ try{ br.close(); read.close(); }catch(Exception ex){ ex.printStackTrace(); } } return sbf.toString(); } }
?
?
??3.MailSender類:發(fā)送郵件封裝類
package cn.com.mes.mail; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.commons.mail.HtmlEmail; import org.apache.log4j.Logger; /** * 發(fā)送郵件封裝類 * @author HuangXiaoyong */ public class MailSender implements Runnable { protected Logger logger = Logger.getLogger(MailSender.class); private MailSenderInfo mailInfo =null; private final String tipInfoFormat = "一共需要發(fā)送{0}封郵件,成功發(fā)送{1}封,失敗發(fā)送{2}封。\n\r失敗郵件列表地址:{3}"; public MailSender(){ mailInfo = MailUtils.getMailSenderInfo(); } public static void main(String[] args){ Runnable run = new MailSender(); run.run(); } @Override public void run() { String addressPath ="D:\\test\\09-09-09.txt"; List<String> list =MailUtils.getToList(addressPath); this.sendHtmlEmail(mailInfo,list); } public String getResultInfo(int sum ,int success,int fail,List<String> failList ) { return MessageFormat.format(this.tipInfoFormat, sum,success, fail, failList.toString()); } public void sendHtmlEmail(MailSenderInfo info, List<String> emailAddresslist, javax.swing.JProgressBar bar){ List<String> fialAddressList = new ArrayList<String>(); bar.setMinimum(0); bar.setMaximum(emailAddresslist.size()-1); //收件人郵件地址list集合 int failCount = 0; int successCount = 0; try{ for(int i=0;i<emailAddresslist.size();i++){ bar.setValue(i); String contentText = MailUtils.getStringBufferText(info.getHtmlPath()); boolean flag = sendSingleHtmlEmail(info.getUsername(), info.getPassword(), info.getHostName(), info.getFrom(), emailAddresslist.get(i), info.getTitle(), contentText, info.getSendDate()); if(flag){ successCount++; }else{ fialAddressList.add(emailAddresslist.get(i)); failCount++; } //發(fā)送10封郵件,當前線程休眠2秒 if(i%10 == 0){ Thread.currentThread().sleep(1000*2); } } }catch(Exception ex){ ex.printStackTrace(); } logger.info(getResultInfo(emailAddresslist.size(),successCount,failCount,fialAddressList)); } public void sendHtmlEmail(MailSenderInfo info,List<String> emailAddresslist) { List<String> fialAddressList = new ArrayList<String>(); //收件人郵件地址list集合 int failCount = 0; int successCount = 0; try{ for(int i=0;i<emailAddresslist.size();i++){ String contentText = MailUtils.getStringBufferText(info.getHtmlPath()); boolean flag = sendSingleHtmlEmail(info.getUsername(), info.getPassword(), info.getHostName(), info.getFrom(), emailAddresslist.get(i), info.getTitle(), contentText, info.getSendDate()); if(flag){ successCount++; }else{ fialAddressList.add(emailAddresslist.get(i)); failCount++; } //發(fā)送10封郵件,當前線程休眠2秒 if(i%10 == 0){ Thread.currentThread().sleep(1000*2); } } }catch(Exception ex){ ex.printStackTrace(); } logger.info(getResultInfo(emailAddresslist.size(),successCount,failCount,fialAddressList)); } /** * * 發(fā)送單個Html文本郵件 * @param username * @param password * @param host * @param from * @param to * @param title * @param context * @return */ public boolean sendSingleHtmlEmail(String username, String password,String host, String from, String to, String title, String context,Date sendDate ) throws Exception{ logger.info(new Date().toString()+": 開始向"+to+"郵箱發(fā)送郵件...."); boolean flag = false; HtmlEmail email =new HtmlEmail(); email.setAuthentication(username,password); email.setHostName(host); email.setCharset("GB2312"); //設置郵件標題 email.setSubject(title); try{ //設置發(fā)件人 email.setFrom(from); //設置收件人 email.addTo(to); //Html郵件上下文,郵件內容 email.setHtmlMsg(context); //設置郵件發(fā)送時間 email.setSentDate(sendDate); email.send(); flag = true; logger.info(new Date().toString()+":成功發(fā)送郵件"); }catch(Exception ex){ logger.error("發(fā)送郵件出現(xiàn)異常!"); throw ex; } return flag; } }
?
?
這些是主要后臺編寫的類,運行效果如下:
首先設置好郵件屬性
?
在添加發(fā)送人的郵件列表(.txt)文件,每個郵件地址用逗號(",")分隔開
swing前臺代碼就不在這里羅列了
?
不足的地方:前臺屬性設置的時候沒有做校驗判斷。
?
遇到的問題有:發(fā)送郵件群發(fā)到一定的數(shù)量的時候,發(fā)送郵件失敗。雖然我這里采用了多線程,問題依舊存在。
?
郵件輕松發(fā)的源碼也上傳上來了,歡迎大家下載源碼。javaeye的高手們,小弟不才,有什么問題和好的建議歡迎大家和我探討、交流,郵箱地址是 hxy7577326@qq.com .
?
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
