本文旨在让测试人员了解如何发邮件
发邮件的话,最简单的事是直接手动发邮件,但是在自动化测试中,应做到让机器或者代码来自动发送邮件,笔者大概了解以下几种方法,总有一款口味适合你:
1java代码来做
下面即为我的java代码
package util;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import static util.txt2.createArray;
public class Mail{
/**
* @param args
* to为发送列表,cc为抄送列表,bcc为密送列表,attach为附件,username为实用的用户名,title为邮件标题,txt为邮件内容
*/
public static final String user = "[email protected]";//发送邮件邮箱
public static final String pwd = "xxx";//发送邮件邮箱密码
public static final String smtp = "smtp.exmail.qq.com";//简单邮件传输协议
static String[] to={"[email protected]","[email protected]"};
static String[] cc={"[email protected]","[email protected]"};
static String[] bcc={"[email protected]","[email protected]"};
static String[] bcc1=null;
static final String attach = "E:\\work\\TestAuto_Integration\\zlr.txt";//附件位置
static final String txt = "E:\\work\\TestAuto_Integration\\zlr.txt";//正文位置
static String username = "xxx";
static String title = "xxx";
public static void main(String[] args) {
mailzlr(tolist,mailname,"xxx",hour6);
}
public static void mailzlr(String[] to,String[] cc,String attach,String username1,String title1,String txt)
{
mailzlr(to,cc,bcc1,attach,username1,title1,txt);
}
public static void mailzlr(String[] to,String attach,String username1,String title1,String txt)
{
mailzlr(to,bcc1,bcc1,attach,username1,title1,txt);
}
public static void mailzlr(String[] to, String username1, String title1, String txt)
{
mailzlr(to,bcc1,bcc1,null,username1,title1,txt);
}
private static void mailzlr(String[] to,String[] cc,String[] bcc,String attach,String username1,String title1,String txt)
{
File file1 = new File(txt);
if (!file1.exists())
{
return;
}
List<File> FileList = new ArrayList<File>();//附件列表
if(attach!=null) {
File file = new File(attach);
FileList.add(file);
}
String title =title1;
String username = username1;
String array[] = createArray(txt);
String x=array[0]+"\n";
for(int i=1;i<array.length;i++)
{
x=x+array[i]+"\n";
}
String text = x+"\n"+"\n";
try{
Properties props = System.getProperties();
props.put("mail.smtp.host", smtp);//这里默认使用163邮箱
Session session = null;
if (user != null && pwd != null) {
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.user", user);
props.put("mail.smtp.password", pwd);
} else {
props.put("mail.smtp.auth", "false");
}
session = Session.getInstance(props,
new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, pwd);
}
});
MimeMessage message = new MimeMessage(session);
if (false) {//是否需要收条
message.addHeader("Disposition-Notification-To","接收收条地址");
}
message.setSubject(title);//
message.setFrom(new InternetAddress(user, username));
String toList = getMailList(to);
InternetAddress[] iaToList = new InternetAddress().parse(toList);
message.setRecipients(Message.RecipientType.TO,iaToList); //收件人
if(cc!=null) {
String toList1 = getMailList(cc);
InternetAddress[] iaToList1 = new InternetAddress().parse(toList1);
message.setRecipients(Message.RecipientType.CC, iaToList1); //抄送人
}
if(bcc!=null) {
String toList2 = getMailList(bcc);
InternetAddress[] iaToList2 = new InternetAddress().parse(toList2);
message.setRecipients(Message.RecipientType.BCC, iaToList2); //密送人
}
MimeMultipart multi = new MimeMultipart();
BodyPart textBodyPart = new MimeBodyPart();
textBodyPart.setText(text);
multi.addBodyPart(textBodyPart);
if (FileList != null) {
for (int i = 0; i < FileList.size(); i++) {
File f = (File) FileList.get(i);
FileDataSource fds = new FileDataSource(f);
BodyPart fileBodyPart = new MimeBodyPart();
fileBodyPart.setDataHandler(new DataHandler(fds));
fileBodyPart.setFileName(MimeUtility.encodeText(f.getName()));//如果附件有中文通过转换没有问题了
multi.addBodyPart(fileBodyPart);
}
}
message.setContent(multi);
message.setSentDate(new Date());
Transport.send(message);
}catch(Exception e){
e.printStackTrace();
}
}
private static String getMailList(String[] mailArray){
StringBuffer toList = new StringBuffer();
int length = mailArray.length;
if(mailArray!=null && length <2){
toList.append(mailArray[0].replaceAll("!","@"));
}else{
for(int i=0;i<length;i++){
toList.append(mailArray[i].replaceAll("!","@"));
if(i!=(length-1)){
toList.append(",");
}
}
}
return toList.toString();
}
}
需要说明的是以下几个参数
static String[] to={"[email protected]","[email protected]"};这是邮件的收件人
static String[] cc={"[email protected]","[email protected]"};这是邮件的抄送人
static String[] bcc={"[email protected]","[email protected]"};这是邮件的密送人
attach 是邮件的附件,需要指定一个代码机器上的路径来发送附件,注意文件夹的话,本质上是无法发送的,需要转为压缩包等其他方式发送
txt是正文,也需要指定一个文件,与attach区别是它需要把内容粘贴进邮件正文,所以需要读取内容,本文演示的是txt
username 是邮件的发送者的名字
title是整个文件标题
2ant的mail标签实现发邮件的功能
ant是允许我们使用一些关键字如mail来发送邮件的,但是只允许发送单个文件或者压缩包作为附件,而正文呢,则是只允许从一些文档中读取
在上文描述中我们会使用ant来自动生成一个报告,里面是一个文件夹,但是文件夹是发送不出来的,想要发送出来就必须使用zip或者tar等关键字把报告文件夹
下文来简单描述一下
<tar destfile="report.tar.bz" compression="bzip2">
<fileset dir="report.zip">
<include name="*"/>
</fileset>
</tar>
<zip destfile="report.zip">
<zipfileset dir="report/${appname}_zlr_${mydate.dt4}"/>
</zip>
<!-- ant发送邮件配置,支持多个收件人,支持抄送,发送的邮件为html格式,发送overview-summary.html为主要内容 -->
<mail from="[email protected]" tolist="[email protected]"
cclist="[email protected]" mailhost="smtp.exmail.qq.com"
user="[email protected]" password="xxxx" subject="自动化测试报告(${date})"
messagefile="${build.report.dir}/overview-summary.html"
messagemimetype="text/html">
<attachments>
<fileset dir="/home/work/zouleiran/apache-ant-1.9.4/bin/autoTest">
<include name="report.zip"/>
</fileset>
</attachments>
</mail>
其中的关键点:
tar 关键字表示打tar包,其中fileset dir这一行是要打包文件夹的路径,include 后面的*表示该文件夹内所有文件全部打包,与linux的*相近
zip关键字表示打zip包,与tar很相近
后面的mail关键字是发送邮件,可以和代码类比
from是邮件发送人,填写发送邮件的同学的邮箱
tolist是发送到的人员名单,中间可以用,空格
cclist是抄送到的人员名单,中间可以用,空格
mailhost为邮箱协议,163的和腾迅企业邮箱是这个,其余的或许不一样,要具体问题具体分析
user与password是邮件标题
messagefile和messagemimetype是正文,文中演示的是txt格式或者html格式的,理论上都ok,但是笔者只使用过这两个,一般的这个ok了
attachments标签是附件,没有可以不写,与上文打包一样,指明文件路径以及要发送的文件,作为附件发出去
3直接请求邮件服务器来发送邮件
对大公司来说,由于以下几个原因
a自动发邮件短信的需求比较大,有必要自己搭建一个服务器
b使用这个技术的人员技术参差不齐,甚至不是技术人员,需要一个更简单并且统一的方式来自动发邮件或者邮件推送
c装x
d公司邮箱的协议比较复杂,甚至密码都是1分钟一换的随机密码,安全性较强使用性较低,故这种方式会比较简洁
所以大公司一般有多个邮件系统,甚至不是代码来做的,使用人员只需要页面点击即可,这种情况不在本文讨论之内
4ui自动化
说白了,一般的邮箱是可以网页登录的,而如果对ui自动化运用纯熟那也是没问题的,页面点击来发送邮件,但是话说回来,如果对ui自动化了解到了那种能自动发邮件的人又怎么会写不出来mail的代码呢?
据我实际工作经验,这个情况主要使用于以下场景:
1页面没有验证码
2邮箱协议复杂,怎么也调不通,而且又没有公司统一的邮箱发送服务器
3装x
5jmeter发送邮件
本文不作过多介绍,只需要明白,由于ant中含有jmeter的关键字标签,使得借助jmeter发送邮件变得可能,不过会了上述方法会觉得jmeter发邮件反而比较麻烦,极度不推荐
上文简单介绍了一下发邮件的方法,使用java发邮件基本上是1,2,3三种方法,那么他们有何不同呢
使用公司的统一邮箱服务发邮件
适用于保密性较高的公司员工,尤其是公司的邮箱协议与密码等有很多特殊性,不易使用代码来发送
当我们在小公司做自动化或者发送邮件时候,常用后两种方式
1使用java代码发送邮件
要求有一点代码能力,好处是能随时随地的发邮件而不是太受到ant工具的限制
2使用ant发邮件
这里其实也有一定代码能力的要求哈,不过比较低,但是由于使用ant发送邮件使得我们不得不受到ant的限制
上制发送邮件的时机,下至发送邮件的内容,邮件的格式等等,都有很多限制
故笔者推荐使用代码发邮件