`
xiaoyong_huang
  • 浏览: 7297 次
  • 性别: 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写的!

相关推荐

    wpf做的邮件群发工具

    **WPF邮件群发工具详解** WPF(Windows Presentation Foundation)是Microsoft开发的一种用户界面框架,它是.NET Framework的一部分,用于构建具有丰富图形效果和交互体验的桌面应用程序。本项目利用WPF技术创建了...

    电子邮件群发系统的设计与实现

    在设计电子邮件群发系统时,可以利用C++Builder开发工具结合Access2000数据库,实现高效稳定的邮件群发功能。C++Builder提供了TIdSMTP组件,这是一款强大的邮件发送组件,支持SMTP和ESMTP协议,可以轻松处理邮件发送...

    C#邮件群发winform程序

    总之,这个C#邮件群发winform程序提供了全面的邮件管理工具,旨在简化大规模邮件发送任务,提高工作效率,同时考虑了用户体验和邮件发送的安全性。无论是个人还是企业,都可以利用这款软件轻松地执行邮件营销活动或...

    PHP 邮件群发类

    总结起来,PHPMailer类是PHP进行邮件群发的强大工具,它支持SMTP验证、HTML邮件、附件和丰富的邮件头设置。通过理解和掌握这些知识点,你可以构建出高效且专业的邮件群发系统,满足各种业务需求。在实际开发中,结合...

    计算机软件-编程源码-群发邮件(4套).zip

    本资源"计算机软件-编程源码-群发邮件(4套).zip"提供的是四套不同的群发邮件软件的源代码,这对于学习电子邮件自动化、网络营销或有兴趣自定义邮件发送系统的开发者来说是非常宝贵的资料。 首先,我们来了解一下...

    邮件群发助手绿色版V3.6

    总结起来,邮件群发助手绿色版V3.6是一款实用性极强的邮件发送工具,尤其适合中小企业和个人进行邮件营销。其易用性、高效性和智能化特性,使用户能够在短时间内完成大量邮件的发送,提高工作效率,同时确保邮件的...

    phpmailer群发邮件

    这个工具包提供了丰富的功能,支持SMTP验证、HTML邮件、附件等,是进行邮件群发的理想选择。** **一、PHPMailer基本使用** PHPMailer的核心在于创建一个`PHPMailer`对象,然后配置必要的属性,如邮件的发件人、收件...

    邮件群发-易语言.zip

    其强大的功能和丰富的库支持,使得开发者能够轻松实现各种复杂的程序功能,包括邮件群发。 邮件群发的核心在于实现SMTP(Simple Mail Transfer Protocol)协议,这是一种用于发送电子邮件的标准协议。在易语言中,...

    .NET 邮件群发系统

    .NET邮件群发系统是一种基于微软的.NET框架构建的软件应用,专门用于批量发送电子邮件到多个收件人。这种系统在企业营销、通知服务或者大型活动宣传等场景中有着广泛的应用。下面将详细介绍.NET邮件群发系统的核心...

    ASP.NET 邮件群发系统开源版

    综上所述,ASP.NET邮件群发系统开源版涉及了Web开发、邮件发送、模板引擎、并发处理、错误处理、数据库交互等多个方面的知识,对于开发者来说,不仅是一个实用的工具,也是一个学习和研究的好案例。

    在Excel中读取学生的E-mail实现成绩单群发

    在Excel中实现学生电子邮件成绩单群发是一个常见的自动化任务,...总结来说,这个任务涉及了Excel的数据管理,VBA编程,以及利用Jmail控件进行邮件群发。熟练掌握这些技能,可以让你在处理类似批量任务时更加得心应手。

    dacaiqi在线邮件群发系统 v1.0.rar

    dacaiqi在线邮件群发系统 v1.0是一款基于PHPMailer构建的实用工具,专为了解决企业批量发送电子邮件给客户的问题。这个系统的核心在于它的高效性和可定制性,使得即使是不熟悉技术的用户也能轻松地进行邮件群发操作...

    9duMail邮件群发系统 1.0.zip

    《9duMail邮件群发系统 1.0:构建高效能邮件营销策略》 9duMail邮件群发系统1.0是一款...在实际使用中,用户只需解压9duMail1.0这个压缩包,按照系统提供的指南进行安装和配置,即可开始使用这一强大的邮件群发工具。

    Python自动化开发-群发邮件源代码

    您可以设置发件人、收件人、主题和正文等信息,实现个性化群发邮件的需求。其次,您可以利用Python的email库来构建邮件内容。这个库提供了丰富的功能,包括添加附件、HTML格式邮件、图片等,使您能够创建出色的邮件...

    邮件群发2012最新

    邮件群发软件通常无需安装,只需解压缩后即可运行,简化了操作流程,使得非专业用户也能轻松使用。 【邮件群发软件的使用】 邮件群发2012最新版是那个时期的一种高效工具,它的特点是便携式设计——用户无需进行...

    Abot邮件群发系统.

    Abot邮件群发系统是一款专为用户设计的高效、稳定的电子邮件营销工具,它在两年多的实际应用和持续改进中逐渐走向成熟,旨在帮助企业和个人轻松实现大规模的邮件发送任务。这款系统具有诸多特点和功能,使得它在邮件...

    php发送邮件,可以群发

    PHP提供了内置的邮件函数,使得开发者能够轻松实现邮件发送功能,包括群发邮件。 PHP的`mail()`函数是用于发送邮件的核心工具。它接受四个主要参数:收件人地址(recipient),邮件主题(subject),邮件正文...

    教你如何实现自动邮件群发工资条

    本文将详细介绍如何利用特定的工具软件实现邮件群发工资条,以减轻财务人员的工作负担。 首先,你需要准备一份完整的Excel格式工资总单,这份文件应包含所有员工的工资信息以及与之对应的邮箱地址。确保每一行数据...

    山东世通邮件群发系统

    总的来说,【山东世通邮件群发系统】是一个实用的工具,尤其适用于企业或个人需要定期向大量订阅者发送通知、新闻或营销邮件的场景。其背后的技术涵盖了.NET编程、数据库管理、邮件传输协议和用户体验设计等多个领域...

    Jmail发邮件的库文件(可以群发)

    JMail是一款广泛应用于VBA(Visual Basic for Applications)和C#等编程语言中的邮件发送库,主要用于实现程序化的邮件群发功能。通过导入JMail库,开发者能够轻松地在自己的应用程序中集成邮件发送功能,无需深入...

Global site tag (gtag.js) - Google Analytics