最近帮朋友实现做的一个项目中涉及到这么的一个需求:每天定时给出勤率不到达标的部门主管发送邮件通知。
这儿涉及到统计出勤人数等具体业务,在此就不会跟大家啰嗦,直奔主题自动定时发送Email
首先添加jar包
主要是spring相关的一些jar和Javax.Email包(我的具体项目中用的是SSM框架),在此我只罗列主要的jar。先上porm文件
1
2
3org.springframework
4spring-context
53.2.16.RELEASE
6
7
8org.springframework
9spring-context-support
103.2.16.RELEASE
11
12
13
14javax.mail
15mail
161.4.7
17
配置Spring JavaMailSenderImpl接口
通过Spring把Email相关配置参数注进去,具体配置如下
1
2class="org.springframework.mail.javamail.JavaMailSenderImpl">
3
4
5
6
7
8
9sltp
10true
11true
12true
13
14
15
注:上面的邮箱密码为发件人的邮箱和密码(替换为自己的邮箱和密码即可;某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”), 对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。比如我用的是163邮箱,所以这里的密码不是我邮箱的密码,而是另外的授权码。调试是最好打开邮箱服务器会返回的信息
编写Email发送接口
1publicinterfaceMailSenderSrv{
2/**
3* 功能: 邮件发送接口
4*
5*@version
6*/
7voidsendEmail(String toAddress, String fromAddress,
8String subject, String msgBody);
9/**
10* 功能: 发html邮件或者普通邮件,msgBody是html文本或者普通文本
11* MimeMessage 消息发送.
12*
13*@paramtoAddress
14*@paramfromAddress
15*@paramsubject
16*@parammsgBody
17*@throwsMessagingException
18*/
19voidsendHtmlEmail(String toAddress, String fromAddress,
20String subject, String htmlBody)
21throwsMessagingException;
22}
这儿我就偷个懒,就写两个接口
编写Email接口的实现类
1@Service("mailSenderSrv")
2publicclassMailSenderSrvImplimplementsMailSenderSrv{
3@Autowired
4privateJavaMailSender mailSender;
5@Override
6publicvoidsendEmail(String toAddress, String fromAddress,
7String subject, String msgBody){
8// 构建Email信息
9SimpleMailMessage simpleMailMessage =newSimpleMailMessage();
10simpleMailMessage.setFrom(fromAddress);
11simpleMailMessage.setTo(toAddress);
12simpleMailMessage.setSubject(subject);
13simpleMailMessage.setText(msgBody);
14// 发送Email
15mailSender.send(simpleMailMessage);
16}
17}
这里我就只写一个实现方法,事实上都差不多啦,就是赋值而已,看其方法的签名就知道了,最后调用JavaMailSender类的send方法发送
到此,使用Spring的辅助发送Email的就已经写完了;我们测试一下
1@RunWith(SpringJUnit4ClassRunner.class)
2@ContextConfiguration("classpath:applicationContext.xml")
3publicclassEmailTest{
4@Autowired
5privateMailSenderSrv eMailSenderSrv;
6@Test
7publicvoid sendEmail() {
8String from ="发件人邮箱";
9String to ="收件人邮箱";
10String subject ="邮件主题测试";
11String text ="邮件主题测试";
12System.out.println("等待发送中...............");
13this.eMailSenderSrv.sendEmail(to, from, subject, text);
14System.out.println("发送完成...............");
15}
16}
下面是debug信息,这里很重要哦,出错了要好好看看这里的信息
接着看看邮箱吧(成不成功这里说了算,不过据说可能会被QQ邮箱服务器当成垃圾邮件拦截,还好我的没问题)
接下来是定时发生的了;网上有不少案例是用Spring+quartz,这个方法也行,我在之前的一个项目中也用过;今天我给大家介绍个比Spring+Quartz更容易配置的————Spring Task
这是Spring3.0以后自定义开发的定时任务工具,我们可以将它比作一个轻量级的Quartz,使用简单方便,除spring相关的包外不需要额外的包,而且支持注解和配置文件两种形式。这里我就只介绍配置文件(注解的百度一下就出来)
首先任务池
1
一句话搞定,pool-size为任务池大小,也可以理解为线程池,通过多线程并行执行定时任务。
添加定时任务
1
2
3
1
为具体的任务代码,method是具体的方法,cron的语法格式和Quartz的一致,
1cron="0/10 * * * * ?"//表示10执行一次
如果有多个任务的话直接在中添加即可
这儿可能你的xml文件会报错,说找不到标签,这是因为标签是Spring3.0以后才有的,所以要用改改xml的的xsd声明
这是我的spring.xml的声明
编写定时任务类
1@Component("AutoSendEmail")
2publicclassAutoSendEmail{
3@Autowired
4privateMailSenderSrv eMailSenderSrv;
5publicvoidsend(){
6// 相关业务逻辑
7Stringfrom="发件人@163.com";
8String to ="收件人@qq.com";
9String subject ="邮件主题测试";
10String text ="定时邮件主题测试";
11System.out.println("等待发送中...............");
12this.eMailSenderSrv.sendEmail(to,from, subject, text);
13System.out.println("发送完成...............");
14}
15}
现在只要将项目启动就行了,这个任务就会每个10秒执行一次
对了,如果这个类不在你之前配置的Spring注解扫描包下,要记得添加注解扫描包。
好吧我的邮件也被拦截了,被当作垃圾邮件了
最后想起件重要的事,有谁需要群发邮件的,或者在Ta生日或者特殊日子发生邮件可以@阿桂,价格咱们细谈
领取专属 10元无门槛券
私享最新 技术干货