java利用模板发送邮件_使用JavaMail实现发送模板邮件以及保存到发件箱

需要用到的jar包

1.freemarker-2.3.19.jar

2.javax.mail.jar

3.javax.activation.jar

本次测试邮箱是腾讯企业邮箱,其他未经测试。

做这个功能是因为我女朋友每个月都需要手动去发几十个人的考勤、考核邮件,实在是太过重复的做一件很乏味的事情,所以才有了这个程序,不过,界面是使用的控制台,简单一点。

核心代码展示

/**

* 发送邮件

* @author hezhao

* @Time 2017年3月13日 上午11:25:15

*/

public void send() {

System.out.println("正在发送邮件至:::["+to+"] ...");

// 设置邮件服务器

Properties prop = System.getProperties();

prop.put("mail.smtp.host", stmpmailServer);

prop.put("mail.smtp.auth", "true");

prop.put("mail.transport.protocol", this.send);

prop.put("mail.smtp.socketFactory.class",

"javax.net.ssl.SSLSocketFactory");

prop.put("mail.smtp.socketFactory.port", this.smtpport);

prop.put("mail.smtp.socketFactory.fallback", "false");

// 使用SSL,企业邮箱必需!

// 开启安全协议

MailSSLSocketFactory sf = null;

try {

sf = new MailSSLSocketFactory();

sf.setTrustAllHosts(true);

} catch (GeneralSecurityException e1) {

e1.printStackTrace();

}

prop.put("mail.smtp.starttls.enable", "true");

prop.put("mail.smtp.ssl.socketFactory", sf);

// 获取Session对象

Session session = Session.getDefaultInstance(prop, new Authenticator() {

// 此访求返回用户和密码的对象

@Override

protected PasswordAuthentication getPasswordAuthentication() {

PasswordAuthentication pa = new PasswordAuthentication(username,

password);

return pa;

}

});

// 设置session的调试模式,发布时取消

session.setDebug(true);

try {

// 封装Message对象

Message message = new MimeMessage(session);

// message.setFrom(new InternetAddress(from,from)); //设置发件人

// 设置自定义发件人昵称

String nick_from = "";

try {

nick_from = javax.mail.internet.MimeUtility.encodeText(this.nickname_from);

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

message.setFrom(new InternetAddress(nick_from + " "));

// 设置自定义收件人昵称

String nick_to = "";

try {

nick_to = javax.mail.internet.MimeUtility.encodeText(this.nickname_to);

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

message.setRecipient(Message.RecipientType.TO, new InternetAddress(nick_to + " "));// 设置收件人

message.setSubject(mailSubject);// 设置主题

message.setContent(mailContent, "text/html;charset=utf8");// 设置内容(设置字符集处理乱码问题)

message.setSentDate(new Date());// 设置日期

// 发送

Transport.send(message);

System.out.println("发送成功...");

//保存邮件到发件箱

saveEmailToSentMailFolder(message);

if(mailSubject.contains("考勤")){

FileLog.writeLog(this.nickname_to + " 发送成功");

}else{

FileLog.writeLog(this.nickname_to + " 发送成功");

}

} catch (Exception e) {

e.printStackTrace();

System.out.println("发送邮件异常...");

if(mailSubject.contains("考勤")){

FileLog.writeLog(this.nickname_to + " 发送失败");

}else{

FileLog.writeLog(this.nickname_to + " 发送失败");

}

}

}

保存至发件箱

/**

* 获取用户的发件箱文件夹

*

* @param message

* 信息

* @param store

* 存储

* @return

* @throws IOException

* @throws MessagingException

*/

private Folder getSentMailFolder(Message message, Store store)

throws IOException, MessagingException {

// 准备连接服务器的会话信息

Properties props = new Properties();

props.setProperty("mail.store.protocol", get);

props.setProperty("mail.imap.host", imapmailServer);

props.setProperty("mail.imap.port", "143");

/** QQ邮箱需要建立ssl连接 */

props.setProperty("mail.imap.socketFactory.class",

"javax.net.ssl.SSLSocketFactory");

props.setProperty("mail.imap.socketFactory.fallback", "false");

props.setProperty("mail.imap.starttls.enable", "true");

props.setProperty("mail.imap.socketFactory.port", imapport);

// 创建Session实例对象

Session session = Session.getInstance(props);

URLName urln = new URLName(get, imapmailServer, 143, null,

username, password);

// 创建IMAP协议的Store对象

store = session.getStore(urln);

store.connect();

// 获得发件箱

Folder folder = store.getFolder("Sent Messages");

// 以读写模式打开发件箱

folder.open(Folder.READ_WRITE);

return folder;

}

/**

* 保存邮件到发件箱

*

* @param message

* 邮件信息

*/

private void saveEmailToSentMailFolder(Message message) {

Store store = null;

Folder sentFolder = null;

try {

sentFolder = getSentMailFolder(message, store);

message.setFlag(Flag.SEEN, true); // 设置已读标志

sentFolder.appendMessages(new Message[] { message });

System.out.println("已保存到发件箱...");

} catch (Exception e) {

e.printStackTrace();

} finally {

// 判断发件文件夹是否打开如果打开则将其关闭

if (sentFolder != null && sentFolder.isOpen()) {

try {

sentFolder.close(true);

} catch (MessagingException e) {

e.printStackTrace();

}

}

// 判断邮箱存储是否打开如果打开则将其关闭

if (store != null && store.isConnected()) {

try {

store.close();

} catch (MessagingException e) {

e.printStackTrace();

}

}

}

}

获取模板内容

/**

* 得到模板内容

* @author hezhao

* @Time 2017年3月13日 下午1:01:08

* @param fileName

* @param map

* @return

*/

public String getMailText(String fileName,Map map){

String htmlText = null;

try {

Template template = config.getTemplate(fileName);

htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);

} catch (IOException e) {

e.printStackTrace();

} catch (TemplateException e) {

e.printStackTrace();

}

return htmlText;

}

替换模板内容

FreemarkerUtil freemarkerUtil = null;

try {

freemarkerUtil = (FreemarkerUtil) context.getBean("freemarkerUtil");

} catch (Exception e) {

System.out.println("出现异常!!!");

e.printStackTrace();

}

String mailContent = freemarkerUtil.getMailText(fileName, map);

HTML模板(这个还是景洲帮我实现的)

table{border-collapse:collapse; text-align: center;font-size:12px;}

.yellow{background: #FFFF00;}

.blod{font-weight: bold;}

${title}
序号部门姓名入职时间考勤结果汇总 备注
正常出勤请假小时迟到分钟迟到扣款旷工天数休年假天数
${no}${dept}${name}${intotime}${workday}${outhour}${deletemin}${deletemoney}${kg}${year}${remark}

${bottom}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# WPF MVVM开发框架Caliburn.Micro IResult和协同程序⑥

“ 引言部分,总领全篇文章的中心内容。”01—IResult and Coroutines在前面,我提到了Actions概念的另一个引人注目的特性,称为协同程序。如果你以前没听说过这个词,下面是维基百科要说的:在计算机科学中,协…

游戏服务器注意事项

1:IO操作是最大的性能消耗点,注意优化余地很大。2:算法数据结构。排序寻路算法的优化。list,vector,hashmap的选择。大数据寻址,不要考虑遍历,注意考虑hash.3:内存管理。重载new/delete,内存池&…

Android之TypedArray 为什么需要调用recycle()

转自:http://blog.csdn.net/Monicabg/article/details/45014327 在 Android 自定义 View 的时候,需要使用 TypedArray 来获取 XML layout 中的属性值,使用完之后,需要调用 recyle() 方法将 TypedArray 回收。 那么问题来了&#x…

APP开发者到期续费说明

几步搞明白APP开发者续费,不再苦恼。1、APP开发者账号快满一年时,注册邮箱会收到一封提醒续费的邮件。主题类似5 days left to renew your iOS Developer Program membership.。 2、点击该邮件中的renew today 按钮,根据提示一路点到底。 3、…

什么就像谈恋爱一样?

1 向这只猫学习!我的妈耶,这撩人的眼神,这小手,以后这大兄die的女朋友还要跟一只猫吃醋,默默先心疼一下2 善良的人最可爱了!3 妈妈救我,马路牙子不让我去找你4 这是童年的回忆呀5 一位网友收到老…

.NET Regular Expressions

HTML去空白回车换行 private static readonly Regex REGEX_LINE_BREAKS new Regex("\n\s*", RegexOptions.Compiled); private static readonly Regex REGEX_LINE_SPACE new Regex("\n\s*\r", RegexOptions.Compiled); private static readonly Regex R…

如何在 Entity Framework 中计算 时间差 ?

咨询区 ison我的项目中有一个需求,需要使用 Entity Framework 实现 日期差 的计算逻辑,参考如下代码:var now DateTime.UtcNow;db.Items.OrderBy(x > x.SomeInteger (x.Date - now).Days);但很奇怪,上面的代码会抛下面的错误…

java外键实体类_java – 在Embeddable类中的外键映射

我正在使用eclipselink进行JPA.我有一个实体,它有一个由两个字段组成的复合键.以下是我的Embeddable主键类的字段(成员).Embeddablepublic class LeavePK {ManyToOne(optional false)JoinColumn(name "staffId",nullable false)private Staff staff;Temporal(Temp…

练习微笑

所谓练习微笑,不是机械地挪动你的面部表情,而是努力地改变你的心态,调节你的心情。学会平静地接受现实,学会对自己说声顺其自然,学会坦然地面对厄运,学会积极地看待人生,学会凡事都往好处想。这…

lost connection to MySQL server at waiting for initial communication packet,system error:o

1 可以先测试mysql本地连接石否正常 2 正常的话查看远程连接的IP在mysql中是否有权限 GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY 123123 WITH GRANT OPTION; note:(记得修改IP抵制和密码)转载于:https://www.cnblogs.com/yaohai…

Android之Activity的4种加载模式

一个Task可以理解成一个Activtiy栈,可以装载一个或者多个Activity,回退和打开的顺序逻辑和基本的数据结构栈是一致的。下面的这段话非常关键:那就是,一个Application如果有N个Activity,这些Activity分布在M个Task中,那么Application的回退栈会遵循这样的原则,首先从当前…

他拥有当今世界最高智商,从出生就一路开挂,然而,获得数学最高奖的他却说自己只是个热爱数学的普通人...

全世界只有3.14 % 的人关注了爆炸吧知识今天就讲讲这位平易近人的顶级天才吧。1975年,陶哲轩出生在澳大利亚,父母均毕业于香港大学,父亲陶象国是一名儿科医生,母亲梁蕙兰是物理和数学专业的高材生,曾当过中学数学教师。…

Win11用户增长迅速!你升了吗?

近日,AdDuplex 发布了 2021 年 11 月微软现代 Windows 操作系统的市场报告。现代 Windows 操作系统的统计只包括 Windows 11 和 Windows 10。Windows 11在 11 月,Windows 11 操作系统的市场份额达到 8.9%,其中包括 8.6% 运行 Windows 11 正式…

Tomcat一步步实现反向代理、负载均衡、内存复制

Tomcat是一个开源的Java EE服务器,想弄明白其中原理还有很长路要走,但是对于有Apache,Nginx经验的我们来说部署它还是没有问题的,下面我们来一步步的构建这些基本的功能吧。 实验环境:rhel 5.8,SElinux已经关闭 一.构建一个基本的…

mysql学时用什么类型_MYSQL数据库学习----MYSQL数据类型

一切数据在计算中都是以二进制形式存储,而8位二进制数就表示1个字节。通常我们说一种数据类型占多少字节,就是说这种数据类型可以表示多少位的二进制数,同时二进制数可以转换为十进制数,进而得到这种数据类型可以表示多大的十进制…

豆瓣9分,颠覆世界观的好书,每读一章就感叹一次:原来如此!(免费领)

全世界只有3.14 % 的人关注了爆炸吧知识聪明人的投资直击本质股神巴菲特曾在2019股东大会上,遇到了一位来自美国旧金山的年轻人提问:“要想成为一个好的投资者,最好的方法是什么?”巴菲特毫不犹豫回答道:“阅读”。5岁…

centos7.0搭建svn服务器

---恢复内容开始--- 在windows上搭建SVN很简单,但是效能却不高,这当然是和linux相比了.然而在linux上搭建SVN却非常繁琐,这篇文章就来一步一步教您如何在Centos上搭建SVN 源码目录:/home/svn/project 工程名:project 工程目录:/home/svn/proj…

Android之常见面试题

http://blog.sina.com.cn/s/blog_4f1d20f30100v23r.html 最近想找找工作看,没想到第一次去面试ANDROID开发工程师就碰壁了,虽然说做了两年的手机开发了,可哥却没参加过一次ANDROID的面试,所以这次一定要汲取教训,面试h…

C# WPF MVVM开发框架Caliburn.Micro Screens, Conductors 和 Composition⑦

01—Screens, Conductors and CompositionActions, Coroutines and Conventions往往最能吸引Caliburn.Micro的注意力,但如果你想让你的UI设计得更好,那么了解屏幕和导体可能是最重要的。如果您想利用合成,这一点尤其重要。杰里米米勒最近在为…

【原创】mysql数据库异常:data truncate for column “*” at row *;data too long *。原因,及解决。...

数据库异常 1.data truncate for column “*” at row *: 就是数据被截断,类似时间被截短(字段属性为date,要存储的数据为timestamp),精度下降。 将数据库的字段属性调整合适,或者将要存储的数据…