`
xiaoyong_huang
  • 浏览: 7336 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

邮件轻松发--邮件群发小工具

    博客分类:
  • Java
阅读更多



      关于这个工具的创作:相信大家都有找工作的经历,在简历投递的时候是否有这样的烦恼?点对点的发送邮件时,不停的复制粘贴自己的简历发送,在这一期间不仅浪费了大家相当多的一部分时间,而且发送简历的效率也不是很高。于是自己便做了一个这样的小工具,能够进行批量、群发邮件的功能。

      一、开发前准备:

      必要的jar包:mail.jar、commons-email-1.1.jar、activation.jar

     

     二、代码编写:

     MailSenderInfo.java  封装Mail普通dojo类

   

package cn.com.mes.mail;

import java.util.Date;
/**
 * 封装邮件发送对象类
 * @author HuangXiaoyong
 */
public class MailSenderInfo {
        //邮件登录账号
	private String username = "";
        //邮件登录密码
	private String password = "";
        //邮件服务器地址
	private String hostName = "";
        //发件人邮箱地址
	private String from = "";
        //邮件标题
	private String title = "";
        //要发送Html文本路径
	private String htmlPath = "";
        //发送时间
	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邮件发送工具类

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;

/**
 * 邮件发送工具类
 * @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";
	//发送邮件标题
	public static final String EMAIL_TITLE ="email.title";
	//发件人邮箱地址
	public static final String EMAIL_FROM = "email.from";
	//发送Html简历路径
	public static final String EMAIL_HTML_PATH = "email.html.path";
	//发送简历时间
	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;
		
	}

        /**
         * 收件人的数目
         * @return
         */
	public static int getToCounts(){
		return mailAddList.size();
	}

        
	
	/**
	 * 获取发送邮件列表从指定的文件中
	 * @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类:发送邮件封装类

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;

/**
 * 发送邮件封装类
 * @author HuangXiaoyong
 */
public class MailSender implements Runnable {
	
	protected Logger logger =  Logger.getLogger(MailSender.class);
	
	private MailSenderInfo mailInfo =null;
	
	private final String tipInfoFormat = "一共需要发送{0}封邮件,成功发送{1}封,失败发送{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++;
                            }
                            //发送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++;
				}
				//发送10封邮件,当前线程休眠2秒
				 if(i%10 == 0){	
					 Thread.currentThread().sleep(1000*2);
				 }
			}
		}catch(Exception ex){
			ex.printStackTrace();	
		}
		logger.info(getResultInfo(emailAddresslist.size(),successCount,failCount,fialAddressList));
		
	}
	
	/**
	 * 
	 * 发送单个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+"邮箱发送邮件....");

		boolean flag = false;
		HtmlEmail  email =new HtmlEmail();
		email.setAuthentication(username,password);
		email.setHostName(host); 
		email.setCharset("GB2312"); 
		//设置邮件标题
        email.setSubject(title); 
        
        try{
        	//设置发件人
	        email.setFrom(from);
	        //设置收件人
	        email.addTo(to); 
	        //Html邮件上下文,邮件内容
	        email.setHtmlMsg(context);
	        //设置邮件发送时间
	        email.setSentDate(sendDate);
	        email.send();
	        flag = true;
	        logger.info(new Date().toString()+":成功发送邮件");
        }catch(Exception ex){
        	logger.error("发送邮件出现异常!");
        	throw ex;
        }
		return flag;
	}

	
	
}

 

 

这些是主要后台编写的类,运行效果如下:

首先设置好邮件属性

 

在添加发送人的邮件列表(.txt)文件,每个邮件地址用逗号(",")分隔开

 

 

swing前台代码就不在这里罗列了

 

不足的地方:前台属性设置的时候没有做校验判断。

 

遇到的问题有:发送邮件群发到一定的数量的时候,发送邮件失败。虽然我这里采用了多线程,问题依旧存在。

 

邮件轻松发的源码也上传上来了,欢迎大家下载源码。javaeye的高手们,小弟不才,有什么问题和好的建议欢迎大家和我探讨、交流,邮箱地址是hxy7577326@qq.com.

 

  • 大小: 46.2 KB
  • 大小: 36.3 KB
  • MES.rar (2.6 MB)
  • 下载次数: 104
分享到:
评论
2 楼 海盗大哥 2012-03-09  
逻辑有问题
int i=0;i<emailAddresslist.size();i++

发送成功一个 emailAddresslist 里面去掉一个吧
1 楼 greatwqs 2011-12-20  
哈哈    用netbeans写的!

相关推荐

    白色大气风格的建筑商业网站模板下载.rar

    白色大气风格的建筑商业网站模板下载.rar

    面向对象编程语言Objective-C基础语法详解及应用

    内容概要:本文详细介绍了面向对象编程语言Objective-C的基础语法,包括其历史背景、特点、环境搭建、基本语法、面向对象编程、高级特性和实际应用。具体涵盖的内容包括Objective-C的历史发展、面向对象编程的核心特性、变量和数据类型、控制结构、函数、数组和字典的使用,以及类、对象、属性和方法的定义与使用。此外,还介绍了高级特性如协议和委托、类别和扩展、ARC、块和GCD。最后,通过示例项目展示了如何在Xcode中创建和调试Objective-C程序,以及如何使用Cocoa和Cocoa Touch框架。 适合人群:具备一定的编程基础,希望学习或深入了解Objective-C编程的开发人员。 使用场景及目标:适用于需要开发macOS和iOS应用的开发者,帮助他们掌握Objective-C的基本语法和高级特性,提高编程效率和代码质量。 其他说明:本文不仅提供了详细的理论讲解,还通过实际代码示例展示了如何在Xcode中创建和调试Objective-C项目,适合初级到中级水平的开发人员学习和参考。

    球馆预约系统ssm.zip

    本次开发的微信小程球馆预约系统,有管理员,用户两个角色。管理员功能有个人中心,用户管理,场地类型管理,球馆信息管理,球馆预约管理,系统管理。用户可以在微信小程序上面注册登录,查看球馆信息,对球馆进行预约操作。 开发本程序后台用到了SSM开发技术,微信端用的是uni-app技术。数据库采用关系数据库市场占有率最高的MySQL作为本程序使用的数据库,完全符合程序使用并且有丰富的拓展余地。 用户在微信小程序注册登录后可以看到首页,首页可以搜索球馆名称,也可以查看球馆资讯,下面是导航栏。 用户点击球馆信息可以进行预约,预约需要输入相关时间等信息。 我的里面可以修改个人信息,可以退出,还可以查看球馆预约信息和我的收藏信息。

    STM32F030单片机串口2发送接收.zip

    1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用KEIL 标准库开发,当前在STM32F030C8T6运行,如果是STM32F030其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 3、软件下载时,请注意keil选择项是jlink还是stlink。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、编译时请注意提示,请选择合适的编译器版本。

    廖鹏盛 - 时代进行曲.zip

    廖鹏盛 - 时代进行曲.zip

    白色大气风格的人体艺术摄影网站模板下载.zip

    白色大气风格的人体艺术摄影网站模板下载.zip

    白色大气风格的服装设计师模板下载.zip

    白色大气风格的服装设计师模板下载.zip

    白色大气风格的景观设计HTML网站模板.zip

    白色大气风格的景观设计HTML网站模板.zip

    (176226648)机器学习领域,基于TensorFlow与mnist数据集,实现手写数字识别,手写数字识别,机器学习学习首选项目

    优质的机器学习资源是当今科技领域的热点,其中TensorFlow作为谷歌公司的开源库,成为最受欢迎的深度学习框架之一,广泛应用于各类项目中。TensorFlow提供了丰富的功能和灵活性,使得开发者可以轻松构建和训练复杂的神经网络模型,处理图像、文本和其他类型的数据。由于其开源性质,拥有庞大的社区支持,用户可以放心使用,并从开源社区中获取宝贵的经验和资源。 mnist数据集是机器学习领域的经典数据集之一。它包含着大量的手写数字图像,供开发者用来训练和测试各种算法和模型。这个数据集的规模相对较小,因此对于绝大多数人来说,无论是数据的下载还是训练过程,都不会对电脑性能提出过高的要求。这使得mnist成为了理想的入门数据集,适合初学者探索和理解机器学习算法的基本原理。 结合Pygame与TensorFlow,你将能够为机器学习实验创建出图形化界面,以及实现交互式处理。Pygame是一款面向游戏和多媒体应用的Python库,但同样也可以用于数据可视化和图形化交互。利用Pygame,你可以展示训练过程中的图像输出、模型的预测结果等,增强对机器学习算法运行情况的直观认识。而且,Pygame的简单。内

    基于两种坐标系的超螺旋滑模观测器的永磁同步电机pmsm无位置(速度)传感器控制模型 支持 dq旋转坐标系和静止坐标系建立smo 引入二阶滑模超螺旋算法替代一阶滑模 dq坐标系引入锁相环PLL估计转速及

    基于两种坐标系的超螺旋滑模观测器的永磁同步电机pmsm无位置(速度)传感器控制模型 支持 dq旋转坐标系和静止坐标系建立smo 引入二阶滑模超螺旋算法替代一阶滑模 dq坐标系引入锁相环PLL估计转速及转子位置 有效削弱抖振 赠送超螺旋滑模搭建推导文档及相关参考资料 仿真模型

    汇编实验算数运算程序设计.docx

    汇编实验算数运算程序设计.docx

    小区监控视频监控方案.doc

    小区监控视频监控方案.doc

    白色大气风格的HTML商务模板下载.zip

    白色大气风格的HTML商务模板下载.zip

    白色大气风格响应式运动健身瑜伽企业网站模板.zip

    白色大气风格响应式运动健身瑜伽企业网站模板.zip

    单片机实验仿真设计报告

    单片机实验仿真设计报告

    白色大气风格的设计公司整站网站模板下载.zip

    白色大气风格的设计公司整站网站模板下载.zip

    白色大气风格的html商务模板.zip

    白色大气风格的html商务模板.zip

    白色大气风格的英文网站模板下载.zip

    白色大气风格的英文网站模板下载.zip

    白色大气风格的科研教育模板下载.zip

    白色大气风格的科研教育模板下载.zip

    stm32驱动摄像头ov7670源程序

    本摄像头ov7670驱动程序已经通过本人的验证可以正常运行,不同的stm32开发板只需要修改引脚即可使用

Global site tag (gtag.js) - Google Analytics