1. 程式人生 > >java windows自動化-mail自動發郵件

java windows自動化-mail自動發郵件

需要 -m vax catch 全部 post ont 地址 兩種

本文旨在讓測試人員了解如何發郵件


發郵件的話,最簡單的事是直接手動發郵件,但是在自動化測試中,應做到讓機器或者代碼來自動發送郵件,筆者大概了解以下幾種方法,總有一款口味適合你:
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的限制
上制發送郵件的時機,下至發送郵件的內容,郵件的格式等等,都有很多限制

故筆者推薦使用代碼發郵件

java windows自動化-mail自動發郵件