使用Spring定时发邮件

最近帮朋友实现做的一个项目中涉及到这么的一个需求:每天定时给出勤率不到达标的部门主管发送邮件通知。

这儿涉及到统计出勤人数等具体业务,在此就不会跟大家啰嗦,直奔主题自动定时发送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生日或者特殊日子发生邮件可以@阿桂,价格咱们细谈

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180224G106LY00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券