对于spring发送邮件的部分看了几天,给小组的项目中添加了这一功能 .
对于spring发送邮件的资料参考了网上的很多.对这一功能的做法大概可以分为三类:
第一类: 对于发送邮件来说是用spring提供的接口直接发送邮件,这一类在网上是比较多的,在此就不多研究了.
第二类: 用对spring 提供的接口进行包装,对于发送的邮件,自己来实现一个队列,这样发送邮件的效率也很高
而且用户体验也不错,其中主要的两点是html发送邮件和如何来实现发送大量的邮件。
下面是引用javaeye上面的文章: 原文地址 http://www.iteye.com/article/49452
其中道理也不是很难,就是实现一个队列,然后由用户触发这个线程,这样很多
需要邮件发送的邮件进入队列,然后后台在一封一封地进行发送。
- 下面要实现我自己的email发送过程.
- 我的实现过程是模拟一个邮件系统,首先用户发送邮件时将邮件保存在自己的邮件服务器上,这个邮件服务器
- 也只是简单的两张表格,然后将信的内容保存在数据库当中.系统后台有一个监听邮件服务器的线程,这个线程
- 对于数据库当中的邮件进行监听,当有邮件时,系统发送邮件之后,将相应的邮件从服务器中删除.这样一来可以
- 实现数量比较多的邮件发送.
- 实现过程:
- 第一: 建立表格:
1. CREATE TABLE `mails` (
`id` int(11) NOT NULL auto_increment,
`from_user` varchar(100) NOT NULL, //发送者的邮件地址
`subject` varchar(50) default NULL, //邮件标题
`text` mediumtext, //邮件正文
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;2. CREATE TABLE `receivers` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(20) default NULL, //接收者姓名
`email` varchar(100) default NULL, //邮件接收者地址
`mail_id` int(11) NOT NULL, //外键对应上面的mails
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 其中mails 实现一对多receivers,这主要是出于系统需要进行群发邮件来考虑的
- 第二 要实现当用户进行群发邮件时,我们需要实现将邮件进行保存在数据库当中
- createMail
方法的细节就不介绍了,主要是问题说说,我在进行发送邮件的时候,我是将
经过html模板处理过的内容作为信件的正文保存在数据库当中
1. String text = VelocityEngineUtils.mergeTemplateIntoString(
velocityEngine, template, "UTF-8", model);
Mail mail=new Mail();
mail.setText(text);
这里有几点要注意的,由于我的模板是用html进行编写的,而且html模板是UTF-8的,我的
数据库也是UTF-8 的,由于刚开始时是按照上面别人写的那块模板那部分处理的,结果出现了
乱码现象,现象为:如果用用
1. String text = VelocityEngineUtils.mergeTemplateIntoString(
velocityEngine, template, model);
MimeMessageHelper help = new MimeMessageHelper(message);
进行发送的时候,模板当中的中文信息会显示乱码 。
而如果用这样的方式:
1. String text = VelocityEngineUtils.mergeTemplateIntoString(
velocityEngine, template, model);
MimeMessageHelper help = new MimeMessageHelper(message, true, "UTF-8");
那么会出现model中的中文信息显示正常,而模板中的静态中文信息显示乱码
最后对于乱码查询了一下,结果网上对于spring 发送html邮件出现的乱码情况不是很多,而且大
多数都是标题出现乱码。最后察看了一下
mergeTemplateIntoString方法,结果用它的第三个方法
可以设置编码的那个,终于搞定这一点。
MimeMessageHelper help = new MimeMessageHelper(message, true, "UTF-8");
String text = VelocityEngineUtils.mergeTemplateIntoString(
velocityEngine, template, "UTF-8", model);
这样就不会出现乱码了。
- createReceivers
- 这个方法实现的主要是将邮件对应的接收者的信息存入数据库就可以了,实现比较简单
第三:要实现一个监听的线程
这个可以实现像上面别人写的,挺不错的。最主要的区别就是这个邮件不是从用户那里直接
得来的而是从数据库当中获取来的。
我写的也不想上面那么详细,没有用到队列,只是取出来一封发送,然后从数据库当中删除
实现起来还是比较简单的。这里就不详细介绍了。