定时执行自动化脚本-(二)ant发送邮件及邮件中添加附件

发送邮件及邮件添加附件均需要用java来实现

1、idea创建一个maven的java项目,目录结构如下

2、pom.xml文件添加依赖的javax.mail

<dependencies>
        <!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.5.4</version>
        </dependency>

    </dependencies>
pom.xml

3、编写FileData和SendMail类

FileData类,实现的是读取文件

SendMail类,实现的功能是发送邮件,添加多个收件人、多个抄送人、邮件正文部分内容从文件读取

 1 package com.rosa.jmail;
 2 
 3 import java.io.*;
 4 
 5 /**
 6  * Created by Administrator on 2017/8/30.
 7  */
 8 public class FileData {
 9     public static String readTxtFile(String filePath) {
10         String encoding = "UTF-8";
11         File file = new File(filePath);
12         Long filelength = file.length();
13         byte[] filecontent = new byte[filelength.intValue()];
14         try {
15             FileInputStream in = new FileInputStream(file);
16             in.read(filecontent);
17             in.close();
18         } catch (FileNotFoundException e) {
19             e.printStackTrace();
20         } catch (IOException e) {
21             e.printStackTrace();
22         }
23         try {
24             return new String(filecontent, encoding);
25         } catch (UnsupportedEncodingException e) {
26             System.err.println("The OS does not support " + encoding);
27             e.printStackTrace();
28             return "";
29         }
30     }
31     public static void main(String[] arg){
32 
33     }
34 }
FileData
  1 package com.rosa.jmail;
  2 
  3 import javax.activation.DataHandler;
  4 import javax.activation.DataSource;
  5 import javax.activation.FileDataSource;
  6 import javax.mail.*;
  7 import javax.mail.internet.*;
  8 import java.text.DateFormat;
  9 import java.text.SimpleDateFormat;
 10 import java.util.Date;
 11 import java.util.Properties;
 12 
 13 /**
 14  * Created by Administrator on 2017/8/29.
 15  */
 16 
 17 public class SendMail {
 18     Date date=new Date();
 19     DateFormat format=new SimpleDateFormat("yyyy-MM-dd");
 20     String time=format.format(date);
 21     private String host = "";  //smtp服务器
 22     private String from = "";  //发件人地址
 23     private String to ="";   //收件人地址
 24     private String tocc="";   //抄送人
 25     private String affix =""; //附件地址
 26     private String affixName =""; //附件名称
 27     private String user = "";  //用户名
 28     private String pwd = "";   //密码
 29     private String subject = ""; //邮件标题
 30     private String filePath1="D:\apache-jmeter-3.1\html\onlineOrder"+time+".txt";
 31     private String filePath2="D:\apache-jmeter-3.1\html\onlineRegister"+time+".txt";
 32 
 33 
 34 
 35     public void setAddress(String from,String to,String tocc,String subject){
 36         this.from = from;
 37         this.to   = to;
 38         this.tocc=tocc;
 39         this.subject = subject;
 40     }
 41 
 42     public void setAffix(String affix,String affixName){
 43         this.affix = affix;
 44         this.affixName = affixName;
 45     }
 46 
 47     public void send(String host,String user,String pwd) {
 48         this.host = host;
 49         this.user = user;
 50         this.pwd  = pwd;
 51 
 52         Properties props = new Properties();
 53 
 54 
 55         //设置发送邮件的邮件服务器的属性(这里使用网易的smtp服务器)
 56         props.put("mail.smtp.host", host);
 57         //需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有这一条)
 58         props.put("mail.smtp.auth", "true");
 59 
 60         //用刚刚设置好的props对象构建一个session
 61         Session session = Session.getDefaultInstance(props);
 62 
 63         //有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使
 64         //用(你可以在控制台(console)上看到发送邮件的过程)
 65         session.setDebug(false);
 66 
 67         //用session为参数定义消息对象
 68         MimeMessage message = new MimeMessage(session);
 69         try{
 70             //加载发件人地址
 71             message.setFrom(new InternetAddress(from));
 72             //加载收件人地址
 73             //多个收件人
 74             if(to!=null&&to.length()>0){
 75                 InternetAddress[] internetAddressTo = new InternetAddress().parse(to);
 76                 message.addRecipients(Message.RecipientType.TO,internetAddressTo);
 77             }
 78             //加载多个抄送人地址
 79             if(tocc!=null&&tocc.length()>0){
 80                 InternetAddress[] internetAddressTocc = new InternetAddress().parse(tocc);
 81                 message.addRecipients(Message.RecipientType.CC,internetAddressTocc);
 82             }
 83           //  message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));  //单个收件人
 84           //  message.addRecipient(Message.RecipientType.CC,new InternetAddress(tocc)); //单个抄送人
 85             //加载标题
 86             message.setSubject(subject);
 87 
 88             // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
 89             Multipart multipart = new MimeMultipart();
 90             FileData fd=new FileData();
 91             //   设置邮件的文本内容
 92             BodyPart contentPart = new MimeBodyPart();
 93             contentPart.setText("Hi all:"+"
"+"        附件为"+time+"线上巡检结果。请查收!"+"以下为今日巡检相关信息:"+"
"+fd.readTxtFile(filePath2)
 94             +"
"+fd.readTxtFile(filePath1));
 95 
 96             multipart.addBodyPart(contentPart);
 97             //添加附件
 98             BodyPart messageBodyPart= new MimeBodyPart();
 99             DataSource source = new FileDataSource(affix);
100             //添加附件的内容
101             messageBodyPart.setDataHandler(new DataHandler(source));
102             //添加附件的标题
103             //这里很重要,通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码
104             sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
105             messageBodyPart.setFileName("=?UTF-8?B?"+enc.encode(affixName.getBytes())+"?=");
106             multipart.addBodyPart(messageBodyPart);
107 
108 
109             //将multipart对象放到message中
110             message.setContent(multipart);
111             //保存邮件
112             message.saveChanges();
113             //   发送邮件
114             Transport transport = session.getTransport("smtp");
115             //连接服务器的邮箱
116             transport.connect(host, user, pwd);
117             //把邮件发送出去
118             transport.sendMessage(message, message.getAllRecipients());
119             transport.close();
120         }catch(Exception e){
121             e.printStackTrace();
122         }
123     }
124 
125     public static void main(String[] args){
126         SendMail cn = new SendMail();
127         Date date=new Date();
128         DateFormat format=new SimpleDateFormat("yyyy-MM-dd");
129         String time=format.format(date);
130         //设置发件人地址、收件人地址和邮件标题
131         cn.setAddress("发件人地址","收收件人地址","抄送人地址",time+"PC&APP超市&供货商系统巡检报告");
132         //设置要发送附件的位置和标题
133         cn.setAffix("D:\apache-jmeter-3.1\日常"+time+".zip","日常"+time+".zip");
134         //cn.setAffix(filepath+"日常"+time+".zip","日常"+time+".zip",filepath+"DetailsReport"+time+".html","DetailsReport"+time+".html");
135         //设置smtp服务器以及邮箱的帐号和密码
136         cn.send("smtp.163.com","***@163.com","你的邮箱密码");
137 
138     }
139 }
SendMail

4、然后把项目下的src和bin文件夹copy至jmeter目录

5、把javax.mail-1.5.4.jar和activation-1.1.jar  copy到ant的antlib目录下

6、编写bulid文件,编译并执行发送邮件的类

完整的build.xml文件

  1 <?xml version="1.0" encoding="UTF-8"?>  
  2   
  3 <project name="zhtx" default="run" basedir="."> 
  4         <tstamp>   
  5         <format property="date" pattern="yyyy/MM/dd kk:mm:ss"/>
  6         <format property="time" pattern="yyyy-MM-dd"/>
  7         <!--kk是24小时制,KK是12小时制-->        
  8         </tstamp> 
  9       
 10         <property name="jmeter.home" value="D:/apache-jmeter-3.1" />
 11         <property name="report.title" value="Jmeter_zhtxAPITestReport"/>    
 12     <!-- jmeter生成jtl格式的结果报告的路径-->  
 13         <property name="jtl.dir" value="${basedir}/jtl" />  
 14     <!-- jmeter生成html格式的结果报告的路径-->  
 15         <property name="html.dir" value="${basedir}/html" />  
 16     <!-- 生成的报告的前缀-->
 17     <!-- 生成的报告的名称-->     
 18         <property name="ReportName" value="DetailsReport" />
 19         <property name="ReportName2" value="SummaryReport" />
 20         
 21         <property name="jtlName" value="${jtl.dir}/${ReportName}{time}.jtl" />  
 22         <property name="htmlName" value="${html.dir}/${ReportName}${time}.html" />
 23         <property name="htmlName2" value="${html.dir}/${ReportName2}${time}.html" />
 24         <property name="zipname" value="日常${time}.zip"/>
 25         <property name="backdir" value="${jmeter.home}/backup"/>
 26 
 27     <!--项目包位置-->
 28         <property name="SRC" value="${basedir}/Java/src" />
 29         <!--编译包位置-->
 30         <property name="class.dir" value="${basedir}/Java/bin" />
 31         <!--依赖Jar位置-->
 32         <property name="lib.dir" value="${basedir}/extendlibs" />
 33         <!--xslt.classpath依赖包位置-->
 34         <property name="lib.home" value="${jmeter.home}/lib"/>
 35         <!--jmx文件存放位置-->
 36         <property name="jmxFile" value="${jmeter.home}/jmx/antjmx"/>
 37         
 38         <path id="xslt.classpath">
 39             <fileset dir="${lib.home}" includes="xalan*.jar"/>     
 40             <fileset dir="${lib.home}" includes="serializer*.jar"/>
 41         </path>
 42         <path id="jar.path">
 43             <!-- 设置工程编译加载jar 环境 -->
 44             <fileset dir="${lib.dir}/">
 45                 <include name="*.jar" />
 46             </fileset>
 47             <pathelement location="${SRC}" />
 48             <pathelement location="${class.dir}" />
 49         </path>
 50     
 51     <!--项目初始化设置-->
 52     <target name="init" description="init" >
 53     <!--删除jtl文件夹下生成的所有文件及文件夹包括空目录,但不删除根目录-->
 54         <delete verbose="true" includeemptydirs="true" >
 55             <fileset dir="${jtl.dir}" >
 56                 <include name="**/*" />
 57             </fileset>
 58          </delete>
 59          <!--删除html文件夹下生成的所有文件及文件夹包括空目录,但不删除根目录-->
 60         <delete>
 61             <fileset dir="${html.dir}">
 62                 <include name="**/*"/>
 63             </fileset>
 64         </delete>
 65         <delete dir="${jmeter.home}/TestResults"/>
 66         <mkdir dir="${jmeter.home}/TestResults"/>
 67     </target>
 68     
 69      <!--执行jmeter脚本--> 
 70     <target name="test" depends="init">  
 71         <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />  
 72         <jmeter jmeterhome="${jmeter.home}" resultlog="${jtlName}">  
 73             <!-- 声明要运行的脚本。"*.jmx"指包含此目录下的所有jmeter脚本-->  
 74             <testplans dir="${jmxFile}" includes="*.jmx" />
 75             <!--声明生成的jtl文件是xml格式,否则会报错 -->
 76             <property name="jmeter.save.saveservice.output_format" value="xml"/>            
 77         </jmeter>  
 78     </target>  
 79         
 80     <!--jmeter报告-->
 81     <target name="report" depends="test" >   
 82         <xslt 
 83               classpathref="xslt.classpath"
 84               force="true"
 85               in="${jtlName}"  
 86               out="${htmlName}"  
 87               style="${jmeter.home}/extras/jmeter.results.shanhe.me.xsl">
 88               <param name="titleReport" expression="${report.title}"/>
 89               <param name="dateReport" expression="${date}"/>              
 90          </xslt>
 91          <xslt 
 92               classpathref="xslt.classpath"
 93               force="true"
 94               in="${jtlName}"  
 95               out="${htmlName2}"
 96               style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl">
 97               <param name="titleReport" expression="${report.title}"/>
 98               <param name="dateReport" expression="${date}"/>              
 99          </xslt>
100         <!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 -->  
101         <copy todir="${html.dir}">  
102             <fileset dir="${jmeter.home}/extras">  
103                 <include name="collapse.png" />  
104                 <include name="expand.png" />  
105             </fileset>  
106         </copy>  
107     </target>
108     
109     <!-- 编译java文件  -->
110     <target name="compile" depends="report">
111             <echo message="**************compile**************" />
112             <javac srcdir="${SRC}" destdir="${class.dir}" encoding="utf-8" classpathref="jar.path" includeantruntime="on" >
113             </javac>
114     </target>
115     
116     <!--打zip包&&备份zip包-->  
117     <target name="build" depends="compile">
118         <!--destfile若不指定文件目录,默认打包到build文件当前目录-->
119         <zip destfile="${jmeter.home}/TestResults/${zipname}" duplicate="preserve">
120          <zipfileset dir="${html.dir}" includes="**/*.*"/>
121         </zip>
122         <copy includeemptydirs="false" todir="${backdir}">
123         <fileset dir="${jmeter.home}/TestResults">
124           <include name="${zipname}"/>
125         </fileset>
126         </copy>
127     </target>  
128     
129     <!--执行java文件-->
130     <target name="run" depends="build">    
131         <java classname="com.rosa.jmail.SendMail"><!--类名,包名不能漏--> 
132         <sysproperty key="file.encoding" value="UTF-8" />        
133           <classpath>  
134               <path location="${class.dir}">
135               </path>
136               <!--类文件路径,不能加包名-->  
137           </classpath>  
138           <classpath>  
139               <!--依赖包,多个同理,可用通配符-->  
140               <fileset dir="${lib.dir}" includes="**/*.jar">
141               </fileset>
142           </classpath>
143         </java>    
144     </target>
145     
146       
147        
148 </project>  
build.xml

执行build文件后,邮件正文格式如下

原文地址:https://www.cnblogs.com/chenchen-tester/p/7462310.html