使用logback发送邮件
需求:
1、报错发邮件,定位错误位置以尽快解决;(报错发送邮件)
2、某一项重要操作完成之后发送邮件;(自定义发送邮件)
没有接触过logback,怎么办?
没办法,硬着头皮上吧。先搞需求1网上查了一波,按照说的一步一步走下来,竟然可以发送了 (意料之中)
首先加入logback需要的jar 这里使用maven
<!-- logback核心包 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.3</version>
</dependency>
<!-- 发送邮件需要的2个jar -->
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>2.7.8</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
网上找个logback.xml,加入以下内容,参数对应填入
需求1:
<!-- 邮件 -->
<!-- SMTP server的地址,必需指定。如网易的SMTP服务器地址是: smtp.163.com -->
<property name="smtpHost" value="127.0.0.1"/><!--填入要发送邮件的smtp服务器地址(问DBA或者经理啥的就知道)-->
<!-- SMTP server的端口地址。默认值:25 -->
<property name="smtpPort" value="25"/>
<!-- 发送邮件账号,默认为null -->
<property name="username" value="zhouyantong@tjtftech.com"/><!--发件人账号-->
<!-- 发送邮件密码,默认为null -->
<property name="password" value="xxx"/><!--发件人密码-->
<!-- 如果设置为true,appender将会使用SSL连接到日志服务器。默认值:false -->
<property name="SSL" value="false"/>
<!-- 指定发送到那个邮箱,可设置多个<to>属性,指定多个目的邮箱 -->
<property name="email_to" value="1185611832@qq.com,1185611832@qq.com"/><!--收件人账号多个可以逗号隔开-->
<!-- 指定发件人名称。如果设置成“<ADMIN> ”,则邮件发件人将会是“<ADMIN> ” -->
<property name="email_from" value="logmonitor" />
<!-- 指定emial的标题,它需要满足PatternLayout中的格式要求。如果设置成“Log: %logger - %msg ”,就案例来讲,则发送邮件时,标题为“【Error】: com.foo.Bar - Hello World ”。 默认值:"%logger{20} - %m". -->
<property name="email_subject" value="【Error】: %logger" />
<!-- ERROR邮件发送 -->
<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>${smtpHost}</smtpHost>
<smtpPort>${smtpPort}</smtpPort>
<username>${username}</username>
<password>${password}</password>
<asynchronousSending>true</asynchronousSending>
<SSL>${SSL}</SSL>
<to>${email_to}</to>
<from>${email_from}</from>
<subject>${email_subject}</subject>
<!-- html格式-->
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<Pattern>%date%level%thread%logger{0}%line%message</Pattern>
</layout>
<!-- 这里采用等级过滤器 指定等级相符才发送 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
<!-- 每个电子邮件只发送一个日志条目 -->
<bufferSize>1</bufferSize>
</cyclicBufferTracker>
</appender>
<root level="info">
<appender-ref ref="EMAIL"/>
</root>
这种配置执行下面代码将会发送邮件!
logger.error("邮件内容");
如果需要直接报错发送邮件的,只需更改如下代码即可
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
<expression>
<!-- 这里可以用java里的表达式 -->
if(level >= WARN && null != throwable) {
return true;
}
return false;
</expression>
</evaluator>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
而我个人更倾向于logger.error("邮件内容"); 原因很简单,规范的代码都有异常处理机制,处理时加入相应的参数发送报错信息,清晰明了!
需求2:
<appender name="EMAILTO" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>${smtpHost}</smtpHost>
<smtpPort>${smtpPort}</smtpPort>
<username>${username}</username>
<password>${password}</password>
<asynchronousSending>true</asynchronousSending>
<SSL>${SSL}</SSL>
<to>${email_to}</to>
<from>${email_from}</from>
<subject>${email_subject}</subject>
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<Pattern>%date%level%thread%logger{0}%line%message</Pattern>
</layout>
<!-- 基于标记的发送邮件 这里我们加入一个标记DONE,发送日志时只需加入此标记即可,如有多个标记加入多个<maker></maker>标签即可 -->
<evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
<marker>DONE</marker>
</evaluator>
<cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
<!-- 每个电子邮件只发一个日志条目 -->
<bufferSize>1</bufferSize>
</cyclicBufferTracker>
</appender>
<root level="info">
<appender-ref ref="EMAILTO"/>
</root>
基于标记的发送邮件任何级别都可以发送,也可以定制级别,这里没有加入级别就不做演示了
基于标记的自定义发送邮件,加入一下代码即可:
logger.info(MarkerFactory.getMarker("DONE"),"邮件内容");
红色内容和上面<maker>标签内的一致即可
最后贴上我的公司邮箱测试的截图
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MarkerFactory;
使用java类发送邮件
1 package org.tfkj.hasl.base.utils;
2
3 import javax.mail.*;
4 import javax.mail.internet.InternetAddress;
5 import javax.mail.internet.MimeBodyPart;
6 import javax.mail.internet.MimeMessage;
7 import javax.mail.internet.MimeMultipart;
8 import java.util.Properties;
9
10 /**
11 * @Author zhouyantong
12 * @Date 2017-10-17 14:05
13 */
14 public class SendMailUtils {
15 private String host = "192.168.1.1"; // smtp服务器 有好多类型的host
16 private String user = "logmonitor@XXX.com"; // 发件人地址
17 private String pwd = "XX@123"; // 密码
18 private String from = "logmonitor"; // 发件人地址
19 private String to = "monitor@XXX.com"; // 收件人地址
20
21 public void send(String subject, String txt) {
22 Properties props = new Properties();
23 // 设置发送邮件的邮件服务器的属性(这里使用网易的smtp服务器)
24 props.put("mail.smtp.host", host);
25 // 需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有这一条)
26 props.put("mail.smtp.auth", "true");
27 // 用刚刚设置好的props对象构建一个session
28 Session session = Session.getDefaultInstance(props);
29 // 有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使
30 // 用(你可以在控制台(console)上看到发送邮件的过程)
31 session.setDebug(false);
32 // 用session为参数定义消息对象
33 MimeMessage message = new MimeMessage(session);
34 try {
35 // 加载发件人地址
36 message.setFrom(new InternetAddress(from));
37 // 加载收件人地址
38 message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
39 // 加载标题
40 message.setSubject(subject);
41 // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
42 Multipart multipart = new MimeMultipart();
43
44 // 设置邮件的文本内容
45 BodyPart contentPart = new MimeBodyPart();
46 contentPart.setText(txt);
47 multipart.addBodyPart(contentPart);
48
49 // 添加附件
50 // BodyPart messageBodyPart = new MimeBodyPart();
51 // DataSource source = new FileDataSource(affix);
52 // 添加附件的内容
53 // messageBodyPart.setDataHandler(new DataHandler(source));
54 // 添加附件的标题
55 // 这里很重要,通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码
56 // sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
57 // messageBodyPart.setFileName("=?GBK?B?"+
58 // enc.encode(affixName.getBytes()) + "?=");
59 // multipart.addBodyPart(messageBodyPart);
60
61 // 将multipart对象放到message中
62 message.setContent(multipart);
63 // 保存邮件
64 message.saveChanges();
65 // 发送邮件
66 Transport transport = session.getTransport("smtp");
67 // 连接服务器的邮箱
68 transport.connect(host, user, pwd);
69 // 把邮件发送出去
70 transport.sendMessage(message, message.getAllRecipients());
71 transport.close();
72 } catch (Exception e) {
73 e.printStackTrace();
74 }
75 }
76
77 public static void main(String[] args) {
78 SendMailUtils s = new SendMailUtils();
79 s.send("主题","内容");
80 }
81
82 }