1.新建customer表生日都选为当天
所需jar包
2.使用c3p0连接到数据的xml配置文件
3.连接数据库的工具类
package com.cc.birthday; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class DataSourceUtils { private static DataSource dataSource=new ComboPooledDataSource(); private static ThreadLocal<Connection> t1=new ThreadLocal<Connection>(); //直接可以获取一个连接池 public static DataSource getDataSource(){ return dataSource; } //获取连接对象 public static Connection getConnection() throws SQLException{ Connection con=t1.get(); if(con==null){ con=dataSource.getConnection(); t1.set(con); } return con; } //开启事务 public static void startTrasaction() throws SQLException { Connection con=getConnection(); if(con!=null){ con.setAutoCommit(false); } } //事务回滚 public static void rollback() throws SQLException{ Connection con =getConnection(); if(con!=null){ con.rollback(); } } //提交并且 关闭资源及从ThreadLocal中释放 public static void commitAndRelease() throws SQLException{ Connection con=getConnection(); if(con!=null){ con.commit(); con.close(); t1.remove(); } } //关闭资源方法 public static void closeConnection() throws SQLException{ Connection con=getConnection(); if(con!=null){ con.close(); } } public static void closeStatement(Statement st) throws SQLException { if(st!=null){ st.close(); } } public static void closeResultSet(ResultSet rs) throws SQLException{ if(rs!=null){ rs.close(); } } }
4.发送邮件的工具类
package com.cc.mail; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMessage.RecipientType; public class MailUtils { //email:邮件发给谁 subject:主题 emailMsg:邮件的内容 public static void sendMail(String email, String subject, String emailMsg) throws AddressException, MessagingException { // 1.创建一个程序与邮件服务器会话对象 Session Properties props = new Properties(); props.setProperty("mail.transport.protocol", "SMTP");//发邮件的协议 props.setProperty("mail.host", "smtp.163.com");//发送邮件的服务器地址 props.setProperty("mail.smtp.auth", "true");// 指定验证为true // 创建验证器 Authenticator auth = new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("emailusername", "password");//发邮件的账号的验证 } }; Session session = Session.getInstance(props, auth); // 2.创建一个Message,它相当于是邮件内容 Message message = new MimeMessage(session); message.setFrom(new InternetAddress("xxxxxx@163.com")); // 设置发送者 message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 设置发送方式与接收者 message.setSubject(subject);//邮件的主题 message.setContent(emailMsg, "text/html;charset=utf-8"); // 3.创建 Transport用于将邮件发送 Transport.send(message); } }
5.customer实体类
package com.cc.birthday; public class Customer { private int id; private String username; private String password; private String realname; private String birthday; private String email; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRealname() { return realname; } public void setRealname(String realname) { this.realname = realname; } public String getBirthday() { return birthday; } public void setBirthday(String birthday) { this.birthday = birthday; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
6.根据数据库查询结果使用调度器定时发送祝福邮件
package com.cc.birthday; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Timer; import java.util.TimerTask; import javax.mail.MessagingException; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import com.cc.birthday.Customer; import com.cc.mail.MailUtils; public class BirthdayListener implements ServletContextListener{ @Override public void contextInitialized(ServletContextEvent sce) { // 当web应用启动开启任务调动---功能在用户的生日当天发送邮件 //开启一个定时器 Timer timer=new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { // 为当前的生日的用户发邮件 //1.获得今天过生日的人 //获得今天的日期 SimpleDateFormat format=new SimpleDateFormat("MM-dd"); String currentDate=format.format(new Date()); //根据当前时间从数据库查询今天过生日的人 QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource()); String sql="select * from customer where birthday like ?"; List<Customer> customerList=null; try { customerList = qr.query(sql, new BeanListHandler<Customer>(Customer.class),"%"+currentDate); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //2.发邮件 if(customerList!=null&&customerList.size()>0){ for(Customer c:customerList){ String emailMsg="亲爱的:"+c.getRealname()+",生日快乐!"; try { MailUtils.sendMail(c.getEmail(), "happy..birthday", emailMsg); System.out.println(c.getRealname()+"邮件发送完毕"); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } },new Date(),10*1000); //实际开发中起始时间是一个固定的时间 //实际开发中间隔时间是1天 } @Override public void contextDestroyed(ServletContextEvent sce) { // TODO Auto-generated method stub } }