本文旨在让测试人员了解如何发邮件

发邮件的话,最简单的事是直接手动发邮件,但是在自动化测试中,应做到让机器或者代码来自动发送邮件,笔者大概了解以下几种方法,总有一款口味适合你:
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 = "xxx@163.com";//发送邮件邮箱
public static final String pwd = "xxx";//发送邮件邮箱密码
public static final String smtp = "smtp.exmail.qq.com";//简单邮件传输协议
static String[] to={"xxx@163.com","xxx@163.com"};
static String[] cc={"xxx@163.com","xxx@163.com"};
static String[] bcc={"xxx@163.com","xxx@163.com"};
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={"xxx@163.com","xxx@163.com"};这是邮件的收件人
static String[] cc={"xxx@163.com","xxx@163.com"};这是邮件的抄送人
static String[] bcc={"xxx@163.com","xxx@163.com"};这是邮件的密送人
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="zouleiran@yunlaiwu.com" tolist="13718378954@163.com"
cclist="13718378954@163.com" mailhost="smtp.exmail.qq.com"
user="13718378954@163.com" 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的限制
上制发送邮件的时机,下至发送邮件的内容,邮件的格式等等,都有很多限制

故笔者推荐使用代码发邮件

java windows自动化-mail自动发邮件的更多相关文章

  1. Selenium 2自动化测试实战37(自动发邮件功能)

    自动发邮件功能 例如,如果想在自动化脚本运行完成之后,邮箱就可以收到最新的测试报告结果.SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到 ...

  2. PHP自动发邮件

    自动发邮件 使用了这个类http://bbs.php100.com/read-htm-tid-121431.html 因他用的php版本较老,用到了函数ereg_replace() 和 ereg() ...

  3. python自动发邮件库yagmail

    #### 一般发邮件方法 我以前在通过Python实现自动化邮件功能的时候是这样的: import smtplib from email.mime.text import MIMEText from ...

  4. python自动发邮件库yagmail(转)

    一般发邮件方法 我以前在通过Python实现自动化邮件功能的时候是这样的: import smtplib from email.mime.text import MIMEText from email ...

  5. Selenium 2自动化测试实战38(整合自动发邮件功能)

    整合自动发邮件功能 解决了前面的问题后,现在就可以将自动发邮件功能集成到自动化测试项目中了.下面重新编辑runtest.py文件 #runtest.py #coding:utf-8 from HTML ...

  6. 发送邮件的几种方法(C#发邮件 和 js前台实现都有)C#后台自动发邮件 js发邮件

    1.后台自动发邮件 1)首先设置邮件参数,这里写在configuration里面 <appSettings> <add key="SMTP" value=&quo ...

  7. jira6.3.6创建问题不自动发邮件通知的问题

    装完jira6.3.6后,设置好邮件服务器,测试没有问题.但是创建问题不自动发邮件提示用户.折腾了大半天,请教了一位大神,终于搞定.步骤是: agile->系统->用户界面->用户缺 ...

  8. redmine创建新闻,自动发邮件给项目组所有成员

    redmine创建新闻,自动发邮件给项目组所有成员: 1.添加用户至公共项目内 2.配置系统邮件推送配置 3.检查用户接受推送配置 3.使用管理员账户发布新闻(不能自己发送自己) 4.查看邮件接受邮件

  9. C# System.Net.Mail.MailMessage 发邮件

    C# System.Net.Mail.MailMessage 发邮件 上篇文化在哪个可以看到使用 System.Web.Mail.MailMessage 发邮件时会提示 ,提供用于构造电子邮件的属性和 ...

随机推荐

  1. Oracle_rowid_rownum分页

      Oracle_rowid_rownum_分页 --rowid select * from account where rowid='AAASR6AAEAAAAJWAAA';       selec ...

  2. JavaSE笔记-泛型

    定义带泛型的类 public class Cat<T> { //可以用T定义实例变量 private T name; //可以用T定义形参 //构造器没有<> public C ...

  3. SQLite学习手册(实例代码<一>)

    一.获取表的Schema信息:       1). 动态创建表.     2). 根据sqlite3提供的API,获取表字段的信息,如字段数量以及每个字段的类型.     3). 删除该表.     ...

  4. hive分区(partition)

    网上有篇关于hive的partition的使用讲解的比较好,转载了:一.背景1.在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据, ...

  5. ASP.NET Core Razor页面禁用防伪令牌验证

    在这篇短文中,我将向您介绍如何ASP.NET Core Razor页面中禁用防伪令牌验证. Razor页面是ASP.NET Core 2.0中增加的一个页面控制器框架,用于构建动态的.数据驱动的网站: ...

  6. linux常用命令_1

    linux中命令格式是什么? 命令 [参数选项] [文件或路径] 中括号表示可选,命令的参数与路径文件可选 参数选择表示一个命令的不同功能 命令 和 参数选项 中必有一空格,多个参数连在一起写 几乎所 ...

  7. sp_getAppLock使用

    sp_getAppLock  获取程序资源锁,简单的说就是调用此函数可以达到我们程序中.NET的lock锁的作用. 作用域是当前数据库下 四个参数: @resource(必填):资源名称,类型nvar ...

  8. Struts2.3.34+Hibernate 4.x+Spring4.x 整合二部曲之下部曲

    1 导入jar包 本文最后会给出项目的地址,各位无须看急. 2 配置web.xml文件 <?xml version="1.0" encoding="UTF-8&qu ...

  9. IO (五)

    1 序列化和反序列化 1.1 ObjectOutputStream 序列化 1.1.1 概述 ObjectOutputStream将Java对象的基本数据写入OutputStream,可以使用Obje ...

  10. 【转】shell字符串截取

    shell字符串的截取的问题: 一.Linux shell 截取字符变量的前8位,有方法如下: 1.expr substr “$a” 1 8 2.echo $a|awk ‘{print substr( ...