javamail邮件提醒通知的实现

本文介绍了如何使用Java的定时器(java.util.Timer)和Servlet监听器实现定时发送邮件通知的功能,以及如何利用Quartz进行手动任务调度。通过实例演示了定时器的配置、邮件发送的具体步骤,并提供了web.xml中的配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

值班短信通知程序实现后,项目有新的需求点:系统定时抑或手动发送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类中,业务方法里面对邮件提醒进行调度使用,具体参考 点击打开链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值