最近刚完成一个任务-付款提醒邮件的发送,对于java邮件的发送有了更深刻的认识,的确java提供的邮件发送机制的确让邮件发送这个问题变得灵活而又简单。并且由于项目组其他人负责了短信的发送,巧的是这个邮件发送的借口与短信发送的借口都被封装到了消息发送的借口,我也顺便学习了一下短信发送的原理,呵呵,算是一箭双雕吧。
那先来说说邮件发送。按照按接口编程的习惯,当然先要定义一个邮件发送的接口,再实现其接口,完成邮件发送Service层的代码。这个顺序我想大家没什么反对意见吧。
首先咱们先定义一个消息发送接口,它是邮件发送与短信发送的上层接口。
再来定义一下邮件发送器接口,由于我这里是通过velocity模板发送邮件的,所以如下定义了接口:
接着实现邮件发送的接口:
大家看到了上面的实现里注入了EmailSender,它也是一个接口,它的实现里注入了JavaMail提供的邮件发送接口。定义了两层是为了区分有模板的发送和无模板的发送。我们来看看它是什么样的:
接着实现这个EmailSender接口:
O(∩_∩)O~大家又注意到了 这个接口实现里又注入了一个接口ConfigService 它是去读取邮件发送的相关配置信息,如上所示:
// configService读出参数
Properties pros = new Properties();
pros.setProperty("mail.smtp.user", configService.getConfig(BasePropertyID.MAIL_SMTP_USER_ID));
pros.setProperty("mail.smtp.host", configService.getConfig(BasePropertyID.MAIL_SMTP_HOST_ID));
pros.setProperty("mail.smtp.port", configService.getConfig(BasePropertyID.MAIL_SMTP_PORT_ID));
pros.setProperty("mail.smtp.connectiontimeout", configService.getConfig(BasePropertyID.MAIL_SMTP_CONNECTIONTIMEOUT_ID));
pros.setProperty("mail.smtp.timeout", configService.getConfig(BasePropertyID.MAIL_SMTP_TIMEOUT_ID));
pros.setProperty("mail.smtp.from", configService.getConfig(BasePropertyID.MAIL_SMTP_FROM_ID));
pros.setProperty("mail.smtp.auth", configService.getConfig(BasePropertyID.MAIL_SMTP_AUTH_ID));
sender.setJavaMailProperties(pros);
sender.setPassword(configService.getConfig(BasePropertyID.MAIL_SMTP_PASSWORD_ID));
而且由于涉及到参数的数据成员较多,就将他们一起封装到了Mail类:
好了 整个接口都实现了,其实排除了你发送邮件提供给邮件发送接口的几个参数,剩下的也就是调用java提供的邮件发送的API和一些邮件发送必备的配置信息,必不是很难懂吧。大家肯定注意到了邮件发送接口的velocity模板解析方法:
content = VelocityParserUtil.getInstance().parseVelocityTemplate(templet, paramMap);
它具体的实现如下所示:
我们会在其他的Service中去调用邮件发送的接口,只需要在业务层里构造好邮件发送的接口所需参数,我们的邮件就可以发送出去了。还有一点请大家注意,我这里主要强调的是运用velocity模板发送邮件,接口所需要的参数templat大家不要误解为velocity模板的文件名,它其实velocity文件的文件流,是一个已经被读入的字符串。大家可以参考一下测试用例,大致可以明白是怎么回事了。
整个邮件的发送大家是否明了了呢,呵呵!
后面我们会将这个接口向上抽象,为了实现我们短信发送的实现,下一篇敬请期待哦