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

发邮件的话,最简单的事是直接手动发邮件,但是在自动化测试中,应做到让机器或者代码来自动发送邮件,笔者大概了解以下几种方法,总有一款口味适合你:
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. volatile 与 synchronized 区别

    在Java中,为了保证多线程读写数据时保证数据的一致性,可以采用两种方式: 同步 如用synchronized关键字,或者使用锁对象. volatile 使用volatile关键字用一句话概括vola ...

  2. word文档自动生成方法

    创建word文档需要几个接口类,常用application,document,documents,selection等.但word的功能复杂,要认识到每一个类的功能是不可能的.常用的方法是在word的 ...

  3. [国嵌攻略][154][Linux-I2C子系统]

    IIC子系统架构 device driver层: 1.device driver,由用户开发. 2.i2c-dev由内核实现,但是需要配合应用模式驱动才能使用. i2c core层: 1.总线驱动,也 ...

  4. [国嵌攻略][098][Linux内核简介]

    Linux系统架构 1.用户空间:应用程序.C函数库 2.内核空间:系统调用接口.内核.体系结构相关代码 Linux系统利用处理器不同的工作模式,使用其中的两个级别分别来运行Linux内核与应用程序, ...

  5. 【编程技巧】JAVA读取url地址中的文本内容

    应用场景:最常见的是有自已的网站,在注册广告联盟的时候.都需要下载一个文本文件来验证网站的有效性.例如淘宝.京东等都有这一过程 实现代码://读url地址的内容        public void ...

  6. Mezzanine (Windows10下)安装配置与修改(更新中)

    最近自己搭个系统,发现Mezzanine很快,先搞个python 2.7, pip. 然后两个方法: 1. $ pip install mezzanine 2. Git下载,解压 后进入目录,创建项目 ...

  7. jQuery——动态给表格添加序号

    摘录自:http://www.cnblogs.com/picaso/archive/2012/10/08/2715564.html 很多时候遇到需要对表格动态操作,而且一般都会有表格的序号,但是有时候 ...

  8. 用jquery怎么删除<table>的一行

    摘录网址:用jquery怎么删除<table>的一行 思路:获取<table>的一行,然后使用 remove() 方法删除之.实例演示如下: 1.HTML结构 <tabl ...

  9. Java进阶篇(四)——Java异常处理

    程序中总是存在着各种问题,为了使在程序执行过程中能正常运行,使用Java提供的异常处理机制捕获可能发生的异常,对异常进行处理并使程序能正常运行.这就是Java的异常处理. 一.可捕获的异常 Java中 ...

  10. Spring MVC中使用POI导出Word

    内容绝大部分来源于网络 准备工作 准备[XwpfTUtil]工具类(来源于网络) 准备word模版 下载[XwpfTUtil]工具类 import org.apache.poi.xwpf.usermo ...