- 浏览: 7336 次
- 性别:
- 来自: 北京
最近访客 更多访客>>
最新评论
-
海盗大哥:
逻辑有问题 int i=0;i<emailAdd ...
邮件轻松发--邮件群发小工具 -
greatwqs:
哈哈 用netbeans写的!
邮件轻松发--邮件群发小工具
关于这个工具的创作:相信大家都有找工作的经历,在简历投递的时候是否有这样的烦恼?点对点的发送邮件时,不停的复制粘贴自己的简历发送,在这一期间不仅浪费了大家相当多的一部分时间,而且发送简历的效率也不是很高。于是自己便做了一个这样的小工具,能够进行批量、群发邮件的功能。
一、开发前准备:
必要的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.
评论
2 楼
海盗大哥
2012-03-09
逻辑有问题
int i=0;i<emailAddresslist.size();i++
发送成功一个 emailAddresslist 里面去掉一个吧
int i=0;i<emailAddresslist.size();i++
发送成功一个 emailAddresslist 里面去掉一个吧
1 楼
greatwqs
2011-12-20
哈哈 用netbeans写的!
相关推荐
白色大气风格的建筑商业网站模板下载.rar
内容概要:本文详细介绍了面向对象编程语言Objective-C的基础语法,包括其历史背景、特点、环境搭建、基本语法、面向对象编程、高级特性和实际应用。具体涵盖的内容包括Objective-C的历史发展、面向对象编程的核心特性、变量和数据类型、控制结构、函数、数组和字典的使用,以及类、对象、属性和方法的定义与使用。此外,还介绍了高级特性如协议和委托、类别和扩展、ARC、块和GCD。最后,通过示例项目展示了如何在Xcode中创建和调试Objective-C程序,以及如何使用Cocoa和Cocoa Touch框架。 适合人群:具备一定的编程基础,希望学习或深入了解Objective-C编程的开发人员。 使用场景及目标:适用于需要开发macOS和iOS应用的开发者,帮助他们掌握Objective-C的基本语法和高级特性,提高编程效率和代码质量。 其他说明:本文不仅提供了详细的理论讲解,还通过实际代码示例展示了如何在Xcode中创建和调试Objective-C项目,适合初级到中级水平的开发人员学习和参考。
本次开发的微信小程球馆预约系统,有管理员,用户两个角色。管理员功能有个人中心,用户管理,场地类型管理,球馆信息管理,球馆预约管理,系统管理。用户可以在微信小程序上面注册登录,查看球馆信息,对球馆进行预约操作。 开发本程序后台用到了SSM开发技术,微信端用的是uni-app技术。数据库采用关系数据库市场占有率最高的MySQL作为本程序使用的数据库,完全符合程序使用并且有丰富的拓展余地。 用户在微信小程序注册登录后可以看到首页,首页可以搜索球馆名称,也可以查看球馆资讯,下面是导航栏。 用户点击球馆信息可以进行预约,预约需要输入相关时间等信息。 我的里面可以修改个人信息,可以退出,还可以查看球馆预约信息和我的收藏信息。
1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用KEIL 标准库开发,当前在STM32F030C8T6运行,如果是STM32F030其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 3、软件下载时,请注意keil选择项是jlink还是stlink。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、编译时请注意提示,请选择合适的编译器版本。
廖鹏盛 - 时代进行曲.zip
白色大气风格的人体艺术摄影网站模板下载.zip
白色大气风格的服装设计师模板下载.zip
白色大气风格的景观设计HTML网站模板.zip
优质的机器学习资源是当今科技领域的热点,其中TensorFlow作为谷歌公司的开源库,成为最受欢迎的深度学习框架之一,广泛应用于各类项目中。TensorFlow提供了丰富的功能和灵活性,使得开发者可以轻松构建和训练复杂的神经网络模型,处理图像、文本和其他类型的数据。由于其开源性质,拥有庞大的社区支持,用户可以放心使用,并从开源社区中获取宝贵的经验和资源。 mnist数据集是机器学习领域的经典数据集之一。它包含着大量的手写数字图像,供开发者用来训练和测试各种算法和模型。这个数据集的规模相对较小,因此对于绝大多数人来说,无论是数据的下载还是训练过程,都不会对电脑性能提出过高的要求。这使得mnist成为了理想的入门数据集,适合初学者探索和理解机器学习算法的基本原理。 结合Pygame与TensorFlow,你将能够为机器学习实验创建出图形化界面,以及实现交互式处理。Pygame是一款面向游戏和多媒体应用的Python库,但同样也可以用于数据可视化和图形化交互。利用Pygame,你可以展示训练过程中的图像输出、模型的预测结果等,增强对机器学习算法运行情况的直观认识。而且,Pygame的简单。内
基于两种坐标系的超螺旋滑模观测器的永磁同步电机pmsm无位置(速度)传感器控制模型 支持 dq旋转坐标系和静止坐标系建立smo 引入二阶滑模超螺旋算法替代一阶滑模 dq坐标系引入锁相环PLL估计转速及转子位置 有效削弱抖振 赠送超螺旋滑模搭建推导文档及相关参考资料 仿真模型
汇编实验算数运算程序设计.docx
小区监控视频监控方案.doc
白色大气风格的HTML商务模板下载.zip
白色大气风格响应式运动健身瑜伽企业网站模板.zip
单片机实验仿真设计报告
白色大气风格的设计公司整站网站模板下载.zip
白色大气风格的html商务模板.zip
白色大气风格的英文网站模板下载.zip
白色大气风格的科研教育模板下载.zip
本摄像头ov7670驱动程序已经通过本人的验证可以正常运行,不同的stm32开发板只需要修改引脚即可使用