本系统的基本功能
在管理端对用户进行邮件回复。
系统使用邮件提醒管理员
使用场景
我的个人博客系统半个月前,有人评论求助,但是我直到最近才登陆后台。然后邮件回复了该用户。
于是我抽空对博客进行了一次升级。
实现思路
回复用户没什么说的,直接发送邮件就行了。关键是邮件提醒管理员。最开始我的思路很简单,只要用户评论就触发邮件系统。这在用户量少的时候没有什么影响的。我又进行了后续的升级。大概就是有一个全局变量,只要有人评论,该变量加一,然后使用spring的定时任务,每天检查一次变量,只要变量大于一。激活邮件系统,该变量置为0。我选择了最简单的实现方法,使用数据库。
邮件发送工具类
本邮件系统基于QQ邮箱
package com.wip.utils;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.Properties;
public class SendQMail {
//私聊 qq 给 其他邮箱发
public static boolean sendMail(String Mail,String emailMsg) throws AddressException, MessagingException {
final String serverHost = "smtp.qq.com"; //发送方邮件服务器
final String from = "***********"; //发件人地址
final String shouqunma = "*****邮件授权码******";
Properties properties = new Properties();
properties.put("mail.smtp.host", serverHost);
properties.put("mail.smtp.auth", "true");//true 一定要用引号引起来
properties.put("mail.transport.protocol", "smtp");
properties.put("mail.smtp.port", "465"); //因为QQ邮箱的端口和人家的不一样,所以要指定
//设置安全提供者
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.socketFactory.fallback", "false");
properties.put("mail.smtp.socketFactory.port", "465");
properties.put("mail.smtp.starttls.enable", "true");
Session session = Session.getDefaultInstance(properties); //不使用Auth命令认证
session.setDebug(true);
//创建并设置消息内容
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(Mail));
Transport transport = session.getTransport("smtp");
msg.setSubject("PreferBlog"); // 设置邮件主题
String fen= "\n-----------------正文部分-----------------\n";
msg.setText("非常感谢您对本博客的支持,回复不及时请见谅"+fen+emailMsg+"\n-----------------个人网站推广-----------------\npd导航(preferdoor.top/nav)\n发送时间: "+new Date().toString());
transport.connect(serverHost,from, shouqunma ); //发送主机服务器,账号,授权码,例如:(QQ:qwuhxadj,163:自己设置)
transport.sendMessage(msg,msg.getAllRecipients());
transport.close();
return true;
}
public static boolean msgMail(String Mail,String emailMsg) throws AddressException, MessagingException {
final String serverHost = "smtp.qq.com"; //发送方邮件服务器
final String from = "***********"; //发件人地址
final String shouqunma = "*****邮件授权码******";
Properties properties = new Properties();
properties.put("mail.smtp.host", serverHost);
properties.put("mail.smtp.auth", "true");//true 一定要用引号引起来
properties.put("mail.transport.protocol", "smtp");
properties.put("mail.smtp.port", "465"); //因为QQ邮箱的端口和人家的不一样,所以要指定
//设置安全提供者
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.socketFactory.fallback", "false");
properties.put("mail.smtp.socketFactory.port", "465");
properties.put("mail.smtp.starttls.enable", "true");
Session session = Session.getDefaultInstance(properties); //不使用Auth命令认证
session.setDebug(true);
//创建并设置消息内容
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(Mail));
Transport transport = session.getTransport("smtp");
msg.setSubject("PreferBlog用户评论"); // 设置邮件主题
msg.setText("有用户评论你了\n"+emailMsg+"\n赶紧上线处理,抓紧时间回复哦");
transport.connect(serverHost,from, shouqunma ); //发送主机服务器,账号,授权码,例如:(QQ:qwuhxadj,163:自己设置)
transport.sendMessage(msg,msg.getAllRecipients());
transport.close();
return true;
}
}
定时工具类
因为我这里使用了数据库所以有toMailService。 @Scheduled(cron = “0 59 13 * * ?”)这个的意思是每天13点59分定时启动。
package com.wip.utils;
import com.wip.model.ToMailDomain;
import com.wip.service.nav.ToMailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
@Component
public class MailTask {
@Autowired
private ToMailService toMailService;
private Logger logger = LoggerFactory.getLogger(getClass());
private int i;
@Scheduled(cron = "0 59 13 * * ?")
public void execute() {
logger.info("thread id:{},FixedPrintTask execute times:{}", Thread.currentThread().getId(), ++i);
ToMailDomain toMailDomain = toMailService.queryNumber("1975781737@qq.com");
int number = toMailDomain.getNumber();
try {
if(number>0){
String msg = "当前有"+number+"位用户评论了您的博客";
SendQMail.msgMail("1975781737@qq.com",msg);
toMailDomain.setNumber(0);
toMailService.updateNumber(toMailDomain);
}
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
用户评论时自动加一
ToMailDomain toMailDomain = toMailService.queryNumber("1975781737@qq.com");
int number = toMailDomain.getNumber();
number++;
toMailDomain.setNumber(number);
toMailService.updateNumber(toMailDomain);
在SpringBoot启动类里加上注解
@EnableCaching // 启用缓存功能
@EnableScheduling // 开启定时任务功能
@SpringBootApplication
@MapperScan("com.wip.dao")
//@EnableCaching
public class MyBlogApplication {
public static void main(String[] args) {
SpringApplication.run(MyBlogApplication.class, args);
}
}