之前工作有一个每天监控日志的需求,周末在家就会很不方便监控,需要远程或者vpn等方式解决,这时候就需要一个小项目来解决这种情况,通过思考我决定使用SpringBoot的框架写一个每天定时发日志到我邮箱,这样就解决了这个问题。
至于为什么选择SpringBoot呢?明明选择普通的java基础项目就可以这个问题。
主要是我看中SpringBoot的轻便和简捷(主要是因为懒,哈哈),再则也能巩固一下SpringBoot的项目搭建使用等问题。
本文着重讲怎么实现邮件发送功能,若需要了解SpringBoot中的定时,可以移步我另一篇博客:quartz在项目中的定时任务实现
具体的步骤如下:.
1.发送邮件需要的dependency的导入
2.邮件需要的配置准备
3.邮件工具类
4.测试发送
接下来分步骤详细说明。
1.邮件应用导入
本文使用的是apache的1.3的邮件工具包,需要其他版本的可以去 maven仓库查找。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.3.3</version>
</dependency>
2.邮件配置准备
本文使用的是163邮箱,也就是我用我的邮箱作为服务端给我自己发邮件。
邮件发送的时候需要服务端邮箱的SMTP授权码才可以发送邮件。SMTP的授权码可以登录自己的163邮箱网页版,在设置中SMTP页面获取到授权码:
在上面这个页面中新增授权密码按照步骤操作后,你会获得一串授权码,授权码只出现一次,记得保存。
3.邮件工具类
获取完授权码后就可以使用工具类了,本文的邮件相关配置是在工具类中直接写上的,有规范要求的可以写在配置文件中通过读取的方式设置。以下是工具类的源码:
import java.util.Date;
import java.util.List;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.MultiPartEmail;
public class MailUtil {
private static String from = "XXXX@163.com";// 用于给用户发送邮件的邮箱
private static String password = "XXXXXXXXXXXX"; // 邮箱的密码
private static String host = "smtp.163.com";// 发送邮件的服务器地址
private static int port = 25;
/**
* @title 邮件发送
* @param to
* @param title
* @param content
*/
public static void sendMail(String to, String title, String content) {
try {
Properties prop = new Properties();
prop.setProperty("mail.host", host);
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");
Session session = Session.getInstance(prop);
session.setDebug(true);
Transport ts = session.getTransport();
ts.connect(host, from, password);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipient(Message.RecipientType.TO, new InternetAddress(
to));
message.setSubject(title);
message.setContent(content, "text/html;charset=UTF-8");
message.saveChanges();
ts.sendMessage(message, message.getAllRecipients());
ts.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @title 邮件发送 带单个附件
* @param to
* @param title
* @param content
* @param path
* @throws Exception
*/
public static void sendAttachmentMail(String to, String title, String content, String path) throws Exception {
try {
MultiPartEmail mail = new MultiPartEmail();
// 设置端口
mail.setSmtpPort(port);
// 设置邮件服务器地址
mail.setHostName(host);
// 设置密码验证
mail.setAuthentication(from, password);
// 邮件发送者
mail.setFrom(from);
// 邮件接收者
mail.addTo(to);
// 邮件编码
mail.setCharset("UTF-8");
// 邮件主题
mail.setSubject(title);
//邮件内容
mail.setMsg(content);
// 创建附件
EmailAttachment attachment = new EmailAttachment();
attachment.setPath(path);
attachment.setDisposition(EmailAttachment.ATTACHMENT);
mail.attach(attachment);
// 设置邮件发送时间
mail.setSentDate(new Date());
// 发送邮件
mail.send();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @title 邮件发送 多个附件
* @param to
* @param title
* @param content
* @param paths
* @throws Exception
*/
public static void sendManyAttachmentMail(String to, String title, String content, List<String> paths) throws Exception {
try {
MultiPartEmail mail = new MultiPartEmail();
// 设置端口
mail.setSmtpPort(port);
// 设置邮件服务器地址
mail.setHostName(host);
// 设置密码验证
mail.setAuthentication(from, password);
// 邮件发送者
mail.setFrom(from);
// 邮件接收者
mail.addTo(to);
// 邮件编码
mail.setCharset("UTF-8");
// 邮件主题
mail.setSubject(title);
//邮件内容
mail.setMsg(content);
// 创建附件
for (String f : paths) {
EmailAttachment attachment = new EmailAttachment();
attachment.setPath(f);
attachment.setDisposition(EmailAttachment.ATTACHMENT);
mail.attach(attachment);
}
// 设置邮件发送时间
mail.setSentDate(new Date());
// 发送邮件
mail.send();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
工具类中有三种发送方式:
1.只包含内容,收件人只有一个
1.包含内容,可添加一个附件文件,收件人只有一个
1.只包含内容,可添加多个附件文件,收件人只有一个
因为我只需要给我自己发邮件查看日志文件即可,需要多个收件人的同学可以自行扩展。
4.测试发送
测试发送的代码如下:
public static void main(String[] args) {
//收件人
String to = "18119311347@163.com";
//邮件主题
String title = OtherUtil.getYesterday(new Date(), "yyyyMMdd") + "记账日志";
//邮件内容
String content = "记账日志与数据已发送至附件,注意查收!\r\n" + new Date().toLocaleString() + "";
//附件 文件路径集合
List<String> paths = new ArrayList<>();
//日志文件
paths.add("D:\\py_log\\0928.txt");
//邮件发送
try {
MailUtil.sendManyAttachmentMail(to, title, content, paths);
} catch (Exception e) {
e.printStackTrace();
}
}
发送成功后查看自己邮箱即可看到发送的内容:
需要定时发送的可以把发送邮件这块的代码放在job中,设置发送时间即可。