????? 關(guān)于這個工具的創(chuàng)作:相信大家都有找工作的經(jīng)歷,在簡歷投遞的時候是否有這樣的煩惱?點(diǎn)對點(diǎn)的發(fā)送郵件時,不停的復(fù)制粘貼自己的簡歷發(fā)送,在這一期間不僅浪費(fèi)了大家相當(dāng)多的一部分時間,而且發(fā)送簡歷的效率也不是很高。于是自己便做了一個這樣的小工具,能夠進(jìn)行批量、群發(fā)郵件的功能。
??????一、開發(fā)前準(zhǔn)備:
????? 必要的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 = "";
//郵件服務(wù)器地址
private String hostName = "";
//發(fā)件人郵箱地址
private String from = "";
//郵件標(biāo)題
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 {
//郵件服務(wù)器地址
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ā)送郵件標(biāo)題
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格式轉(zhuǎn)化成字符串
* @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;
}
/**
* 將日期字符串轉(zhuǎn)化成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;
}
/**
* 設(shè)置郵件屬性
* @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;
}
/**
* 獲取指定文件的內(nèi)容
*
* @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封郵件,當(dāng)前線程休眠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封郵件,當(dāng)前線程休眠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");
//設(shè)置郵件標(biāo)題
email.setSubject(title);
try{
//設(shè)置發(fā)件人
email.setFrom(from);
//設(shè)置收件人
email.addTo(to);
//Html郵件上下文,郵件內(nèi)容
email.setHtmlMsg(context);
//設(shè)置郵件發(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;
}
}
?
?
這些是主要后臺編寫的類,運(yùn)行效果如下:
首先設(shè)置好郵件屬性
?
在添加發(fā)送人的郵件列表(.txt)文件,每個郵件地址用逗號(",")分隔開
swing前臺代碼就不在這里羅列了
?
不足的地方:前臺屬性設(shè)置的時候沒有做校驗判斷。
?
遇到的問題有:發(fā)送郵件群發(fā)到一定的數(shù)量的時候,發(fā)送郵件失敗。雖然我這里采用了多線程,問題依舊存在。
?
郵件輕松發(fā)的源碼也上傳上來了,歡迎大家下載源碼。javaeye的高手們,小弟不才,有什么問題和好的建議歡迎大家和我探討、交流,郵箱地址是 hxy7577326@qq.com .
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

