zoukankan      html  css  js  c++  java
  • java windows自动化mail自动发邮件

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


    发邮件的话,最简单的事是直接手动发邮件,但是在自动化测试中,应做到让机器或者代码来自动发送邮件,笔者大概了解以下几种方法,总有一款口味适合你:
    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的限制
    上制发送邮件的时机,下至发送邮件的内容,邮件的格式等等,都有很多限制

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

  • 相关阅读:
    曾经写的一些文章,与技术无关,整理出来怀旧,:)
    在VS.NET2003中使用XHTML的插件HTML TIDY 及 MindManger
    把机器退出了域,造成无法启动 MSSQLSERVER ,晕
    hello php!
    今天又看了一下存储过程
    [转]PAGEII携手极速网爱情电影经典对白
    关键词:2005年,世乒赛.上海,乒乓的胜地
    一本SharePoint方面的书,Special Edition Using Microsoft® SharePoint Portal Server
    keo计划
    关于xp_cmdshell 。。注意安全!
  • 原文地址:https://www.cnblogs.com/xuezhezlr/p/8452825.html
Copyright © 2011-2022 走看看