• logback 发送邮件和自定义发送邮件;java类发送邮件


    使用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"/><!--收件人账号多个可以逗号隔开-->
        <!-- 指定发件人名称。如果设置成“&lt;ADMIN&gt; ”,则邮件发件人将会是“<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 &amp;&amp; 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 }

     

  • 相关阅读:
    window10 安装docker
    el-select value是数字不回显
    JS垃圾回收机制(转)
    mybatis 动态sql (转载)
    mybatis SQL 语句构建器
    vue 面试总结
    Stream解析(转载)
    JVM参数
    SourceTree 版本跳过bitbucket注册方法
    win10配置git SSH
  • 原文地址:https://www.cnblogs.com/zhouyantong/p/7682941.html
Copyright © 2020-2023  润新知