您的位置:首页 > 编程语言 > Java开发

javamail邮件提醒通知的实现

2013-12-25 15:00 435 查看
值班短信通知程序实现后,项目有新的需求点:系统定时抑或手动发送E-mail到某用户,告知其已经达到通知的效果。
example one:(定时发送)
        首先介绍java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask)。
如: 每隔一个小时执行任务timer.schedule(TimerTask, 0, 60 * 60 * 1000);
         schedule方法的第一个参数是需要执行的任务,此类的类型为java.util.TimerTask,第二个参数为执行任务前等待时间,此处0表示不等待,第三个参数为间隔时间,单位为毫秒;
        由于我们希望当Web工程启动时,定时器能自动开始计时,这样在整个Web工程的生命期里,就会定时的执行任务,因此启动定时器的类不能是一般的类,此处用Servlet的监听器类来启动定时器,通过在配置文件里配置此监听器,,让其在工程启动时自动加载运行,存活期为整个Web工程生命期。

要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口,以下是实例:
第一步:自己创建一个Mail4DutyTimerTask类,紧接着写上SendEmail 类
public class Mail4DutyTimerTask implements ServletContextListener{
private Timer timer = null;
public void contextDestroyed(ServletContextEvent event){
timer.cancel();
event.getServletContext().log("--- 定时器被销毁 ---");
}
public void contextInitialized(ServletContextEvent event){
// 在这里初始化监听器,在tomcat启动的时候监听器启动,可以在这里实现定时器功能
timer = new Timer(true);
//添加日志,可在tomcat日志中查看到
event.getServletContext().log("--- 定时器已启动 ---");
//调用exportHistoryBean,0表示任务无延迟,5*1000表示每隔5秒执行任务,60*60*1000表示一个小时;
timer.schedule(new SendEmail(event.getServletContext()), 0, 24*60*60*1000);
}
}
使用javamail发送邮件需要三个包,commons-email.jar,activation.jar,mail.jar(一开始没引入这个mail.jar,结果报错,java.lang.NoClassDefFoundError:javax.mail.Authenticator),由于原项目已经有mail.jar,所以发布到项目的lib目录下的jar包如下所示:



public class SendEmail extends TimerTask {

private ServletContext context = null;

public SendEmail(ServletContext context){
this.context = context;
}

@Override
public void run(){
// 接下来我们开始javamail的邮件发送的欢乐之旅
System.out.println("正在发送邮件...");
Properties props=new Properties();
// 发件人使用发邮件的电子信箱服务器我使用的是公司邮箱的服务器
props.put("mail.smtp.host","mail.greedc.com");
// 这样才能通过验证
props.put("mail.smtp.auth","true");
Session s = Session.getInstance(props);
s.setDebug(true);
MimeMessage message = new MimeMessage(s);
try{
// 给消息对象设置发件人/收件人/主题/发信时间
String tto=null;
String ttitle=null;
Object tcontent=null;

// 发邮件的出发地(发件人的信箱),这是我的邮箱地址,使用请改成你的有效地址
InternetAddress from=new InternetAddress("caizedong@greedc.com"); message.setFrom(from);
// tto为发邮件的目的地(收件人信箱)
InternetAddress to=new InternetAddress(tto); message.setRecipient(Message.RecipientType.TO,to);
// ttitle为邮件的标题
message.setSubject(ttitle); message.setSentDate(new Date());
// 新建一个存放信件内容的BodyPart对象
BodyPart mdp=new MimeBodyPart();
// 给BodyPart对象设置内容和格式/编码方式tcontent为邮件内容
mdp.setContent(tcontent,"textml;charset=utf-8");
// 新建一个MimeMultipart对象用来存放BodyPart对象(事实上可以存放多个)
Multipart mm=new MimeMultipart();
// 将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart)
mm.addBodyPart(mdp);
// 把mm作为消息对象的内容
message.setContent(mm);
message.saveChanges();
Transport transport=s.getTransport("smtp");
// 发邮件人帐户密码,此外是我的帐户密码,使用时请修改。
transport.connect("mail.greedc.com","caizedong","123456789");
transport.sendMessage(message,message.getAllRecipients());
transport.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
第二步:定时器在web.xml配置为
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd"> 
<listener>
<listener-class>com.greedc.czd.mail4duty.Mail4DutyTimerTask</listener-class>
</listener>

</web-app>

example two:(手动推送,利用quartz进行任务调度)
第一步:同上
第二步:在TaskJob类中,业务方法里面对邮件提醒进行调度使用,具体参考点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息