发送邮件及邮件添加附件均需要用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>
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 }
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:"+"\r\n"+" 附件为"+time+"线上巡检结果。请查收!"+"以下为今日巡检相关信息:"+"\r\n"+fd.readTxtFile(filePath2) 94 +"\r\n"+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 }
4、然后把项目下的src和bin文件夹copy至jmeter目录
5、把javax.mail-1.5.4.jar和activation-1.1.jar copy到ant的\ant\lib目录下
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文件后,邮件正文格式如下