实现功能主要技术点:

Listener(监听器)

使用Java发送邮件(JavaMail的使用)

代码示例

创建web工程,写一个监听器监听ServletContext对象的创建(创建时机:启动服务器,部署该工程),ServletContext对象创建时,开启定时器查询数据库用户表中当天过生日的用户,使用封装的MailUtils工具类,给用户发送生日邮件。

  • BirthdayMailListener
/*ServletContextListener作用:监听ServletContext对象的创建与销毁扩展:servletcontext创建:启动服务器的时候servletContext销毁:关闭服务器. 从服务器移除项目*/
@WebListener()
public class BirthdayMailListener implements ServletContextListener {/*** 监听ServletContext对象的创建*/@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {System.out.println("启动服务器,创建ServletContext执行");//实例化定时器对象Timer timer = new Timer();//得到定时器第一次执行的时间,如已过第一次执行的时间,则启动定时器时定时器任务就会执行一次String firstTimeStr="2020-02-22 10:00:00";SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date firstTime=null;try {firstTime = simpleDateFormat.parse(firstTimeStr);System.out.println("BirthdayMailListener firstTime"+firstTime);} catch (ParseException e) {e.printStackTrace();}/*给定时器对象指派任务。参数说明:task:TimerTask接口,定时器任务对象,需要创建一个匿名内部类,把要执行的代码写在run方法里firstTime:第一次执行的时间,类型是Dateperiod:任务执行的周期间隔,单位毫秒 。*/timer.schedule(new TimerTask() {@Overridepublic void run() {//调用业务逻辑层,得到今天过生日的用户UserService userService = new UserService();List<User> userList =userService.getBirthdayUsers();System.out.println("BirthdayMailListener userList"+userList);for (User user :userList) {try {MailUtils.sendMail(user.getEmail(),"生日邮件","祝您生日快乐!!!");System.out.println("今天是"+user.getUsername()+"的生日,已给他/她发送了生日邮件");} catch (MessagingException e) {e.printStackTrace();}}}},firstTime,24*60*60*1000);}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {}
}
  • UserService
public class UserService {public List<User> getBirthdayUsers() {List<User> birthdayUsers = null;try {//通过指定格式的SimpleDateFormat格式化Date对象,得到 月-日 (如:02-24)SimpleDateFormat simpleDateFormat=new SimpleDateFormat("MM-dd");String today = simpleDateFormat.format(new Date());System.out.println(today);//调用数据访问层,查询今天过生日的用户UserDao userDao=new UserDao();birthdayUsers = userDao.getBirthdayUsers(today);} catch (SQLException e) {e.printStackTrace();}return birthdayUsers;}
}
  • UserDao
public class UserDao {public List<User> getBirthdayUsers(String today) throws SQLException {QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());/*Mysql数据类型-日期和时间类型- DATE类型DATE类型用于仅需要日期值时。日期格式为 'YYYY-MM-DD',其中 YYYY 表示年,MM 表示月,DD 表示日。在业务逻辑层得到的today="02-24"*///使用LIKE的模糊查询String sql="select * from t_user where birthday like ?";//①要封装,则User类的属性名要与数据库的字段名相同。②百分号%是 MySQL中常用的一种通配符,在过滤条件中,百分号可以表示任何字符串。List<User> userList = queryRunner.query(sql, new BeanListHandler<User>(User.class), "%" + today);return userList;}}

数据库中的部分用户表:

  • User
public class User {private String username;private Integer password;private String email;private Date birthday;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Integer getPassword() {return password;}public void setPassword(Integer password) {this.password = password;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "User{" +"name='" + username + '\'' +", password=" + password +", email='" + email + '\'' +", birthday=" + birthday +'}';}
}
  • JDBCUtils
public class JDBCUtils {//使用Druid数据库连接池技术获取数据库连接private static DataSource createDataSource;static{try {Properties pros = new Properties();
//            InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");pros.load(is);createDataSource = DruidDataSourceFactory.createDataSource(pros);} catch (Exception e) {e.printStackTrace();}}public static Connection getConnection() throws SQLException {return createDataSource.getConnection();}public static DataSource getDataSource() throws SQLException {return createDataSource;}//使用dbutils.jar中提供的DbUtils工具类,实现资源的关闭public static void closeResource(Connection conn, Statement ps, ResultSet rs){DbUtils.closeQuietly(conn);DbUtils.closeQuietly(ps);DbUtils.closeQuietly(rs);}public static void closeResource(Connection conn){DbUtils.closeQuietly(conn);}public static void closeResource(Connection conn,ResultSet rs){DbUtils.closeQuietly(conn);DbUtils.closeQuietly(rs);}
}
  • MailUtils
/*** 发送邮件工具类*/
public final class MailUtils {private MailUtils(){}/*** 发送邮件* @param email 收件人的邮箱地址* @param subject 邮件主题* @param emailMsg 邮件内容*/public static void sendMail(String email, String subject, String emailMsg)throws AddressException, MessagingException {// 1.[连接发件服务器]创建一个程序与发件人的 发送邮件服务器会话对象 SessionProperties props = new Properties();props.setProperty("mail.transport.protocol", "SMTP");//邮件发送协议props.setProperty("mail.host", "smtp.qq.com");//邮件发送服务器的地址(如QQ邮箱的发件服务器地址SMTP服务器: smtp.qq.com)props.setProperty("mail.smtp.auth", "true");//指定验证为true// 创建验证器Authenticator auth = new Authenticator() {public PasswordAuthentication getPasswordAuthentication() {//发件人的用户名(不带后缀的,如QQ邮箱的@qq.com不用写)和授权码(这里一般不使用密码,为避免密码泄露,用授权码代替密码登录第三方邮件客户端)//授权码:用于登录第三方邮件客户端的专用密码。  第三方邮件客户端:如这个java程序。return new PasswordAuthentication("QQ邮箱地址不带@qq.com", "开启POP3/SMTP服务得到的授权码");}};Session session = Session.getInstance(props, auth);// 2.[创建一封邮件]创建一个Message,它相当于是邮件内容Message message = new MimeMessage(session);message.setFrom(new InternetAddress("创建验证器时你用的用户名@qq.com")); // 设置发送者的邮箱地址message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 设置发送方式与接收者message.setSubject(subject);//邮件主题message.setContent(emailMsg, "text/html;charset=utf-8");//设置邮件的内容// 3.[发送邮件]创建 Transport用于将邮件发送Transport.send(message);}
}

部署工程后,因已过第一次执行的时间,部署工程后就会启动定时器执行定时器任务一次,给当天生日用户发送生日邮件:

简易的定时发送生日邮件功能(Listener+定时器+使用java发送邮件)相关推荐

  1. html发送qq邮件消息,Python3实现发送QQ邮件功能(html)_python

    这篇文章主要为大家详细介绍了Python3实现发送QQ邮件功能,html格式的qq邮件,具有一定的参考价值,对Python3感兴趣的小伙伴们可以参考一下本文,本文为大家分享了Python3实现发送QQ ...

  2. php定时发送生日模块消息_PHP实现好友生日邮件提醒

    我有一个想法是这样的,希望每天知道今天是我哪位好友的生日? 当然,我得首先保存我所有好友的生日信息 实现:在新浪申请免费服务器,并申请Mysql应用,然后建一张表保存好友的信息 我想,我已经完成第一步 ...

  3. 根据生日定时发送生日祝福邮件

    需求 根据不同的生日日期,在生日当天发送一个祝福邮件,这是需要做到两个事情 定时,根据生日定时到每年的那一天 发送邮件 定时发送 要想做到定时发送,这时就需要一个定时任务调度的工具,这里使用的是Qua ...

  4. python生日祝福短信_python-定时发送生日邮件祝福

    前言:按照人事的想法,能不能帮助他们定时发送员工生日祝福邮件. 正好学到python ,打算练下手 直接附上代码 个人想法:第一步数据库建立一张员工信息表:用于记录员工的名字,生日,邮箱.对于表没有专 ...

  5. MTK 7.1 定时发送短信功能

    此功能的主要设计思路是: 在短信添加附件的list列表中添加一个定时发送短信的选项,用户可以通过添加定时短信来设置短信要发送出去的时间,定时短信发送出去后,后台定时器会根据用户设置的时间进行定时判定, ...

  6. python数据分析天气预报论文_Python定时发送天气预报邮件

    用python爬虫爬到的天气预报,使用smtplib和email模块可以发送到邮箱,使用schedule模块可以定时发送.以下是代码- #导入模块 import requests from bs4 i ...

  7. Python每天定时发送监控邮件

    不管是在信贷领域还是支付领域,作为一个风控人员,我们都需要对部署的策略模型进行监控,信贷领域可能还需要对客户的逾期表现进行监控.这时,如果我们能用python自动连接数据库,对策略.模型.贷后表现等数 ...

  8. php发送163邮件554,PHPMailer配置163邮箱发送邮件

    今天开发的功能中,需要实现发送邮件通知提醒,而PHP端使用的是PHPMailer这个第三方库来实现的,发送者邮件使用的是网易的163邮箱,但是在调试的时候遇到了问题,那就是一直报没有权限.最后才明白原 ...

  9. php定时发送生日模块消息_RocketMQ消息队列介绍与应用

    RocketMQ简单介绍 RocketMQ是一个消息中间件,MQ的主要特点为解耦.异步.削峰,具有高性能.高可靠.高实时.分布式特点,用于减少数据库压力的业务场景,其中RocketMQ的核心组件概念如 ...

最新文章

  1. ecilpse连接oracle ojdbc驱动
  2. HDFS namenode 高可用(HA)搭建指南 QJM方式 ——本质是多个namenode选举master,用paxos实现一致性...
  3. 一网打尽深度学习之卷积神经网络的经典网络(LeNet-5、AlexNet、ZFNet、VGG-16、GoogLeNet、ResNet)
  4. xlsxwriter 合并单元格_Python3之excel操作xlsxwriter模块
  5. 将数组的列表结构转成树结构
  6. 从头学习Drupal--基本架构三
  7. Fiddler工具工作原理
  8. 一些散落各处的移动开发好资源
  9. 使用Ueditor点击上传图片时显示延迟的问题
  10. 【优化选址】基于matlab粒子群算法求解充电站规划优化问题【含Matlab源码 664期】
  11. 高德地图API-获取位置信息的经纬度
  12. 讓TQ2440也用上設備樹(1)
  13. 14.Java- Spring
  14. Spring集成JPA提示Not an managed type
  15. 用树莓派做MIDI HOST,给合成器外接MIDI键盘
  16. μC/OS-III_系统特点
  17. ubuntu 12.04 下安装 、配置、启动 FTP、SSH、NFS服务
  18. MySQL超市会员管理系统_springboot+mysql超市会员管理系统
  19. 将彩色和深度图转成点云图
  20. SMT/IC贴片元器件封装类型的识别

热门文章

  1. 微信小程序开发动感十足的加载动画--都在这里!
  2. oracle index alter,Oracle alter index rebuild 一系列问题
  3. SRT视频字幕的解析与同步原理
  4. java类求圆的面积周长_java编程 1. 设计一个求圆的面积和周长的类,要求:1计算当半径r,JAVA编程题。编写一个应用程序计算圆的周长和面积,设圆的半...
  5. 你认识细菌吗?一文带你读懂了解它
  6. 不要再「外包」AI 模型了!最新研究发现:有些破坏机器学习模型安全的「后门」无法被检测到...
  7. 多线程导出excel高并发_用多线程优化Excel表格数据导入校验的接口
  8. Win11安卓子系统无法启动怎么办?安卓子系统启用虚拟机平台教程(确保在可选的Windows功能中启用虚拟机平台)
  9. 读 联想:去尖刀上跳舞!有感
  10. lcd timg的理解