使用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 }