zoukankan      html  css  js  c++  java
  • Java邮件服务学习之三:邮箱服务客户端-Java Mail

    一、java mail的两个JAR包

    1、mail.jar:不在JDK中,核心功能依赖JDK4及以上,该jar包已经加入到java EE5;

    下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html

    2、activation.jar:JavaMail依赖JAF(JavaBeans Activation Framework),JAF在Java6之后已经合并到JDK中,而JDK5之前需要另外下载JAF的类库。

    最好单独下载加入到工程中。

    下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html

    二、常用API介绍

    1. javax.mail.Session:会话类,如服务器的主机名、端口号、协议名称等  主要用来创建邮件对象、实现邮件对象中数据的封装并可指定邮件服务器认证的客户端属性。它表示程序与某一个邮件服务器即将建立通信,在建立的过程可以进行口令认证。
    2. javax.mail.Message:邮件模型,发送邮件和接收邮件的媒介,封装了邮件的信息,如发件人、收件人、邮件标题、邮件内容等  
    3. javax.mail.Transport:邮件发送类 连接邮件SMTP服务器,发送邮件  
    4. javax.mail.Store:邮件接收类 连接邮件POP3、IMAP服务器,收取邮件, 邮件服务器中的存储库,里面放着所有的邮件文件夹
    5. javax.mail.internet.InternetAddress 主要是表示邮件发送人和邮件接收人的地址
    6. javax.mail.Folder  该文件夹就是消息的具体所在文件夹,默认的邮件均在INBOX文件中

    三、使用java mail 发送邮件

    基本步骤:

    1 利用Properties来设置Session,一般主要设置两个mail.smtp.host和mail.smtp.auth,第一个主要是设置邮件服务器名,第二个是设置口令true或者false

    2 利用Session.getInstance(Properties)启动一个与邮件服务器的会话

    3 根据获取的Session来传建一个消息Message

    4 定义消息的发信人地址InternetAddress和消息的收信人地址。

    5 设置消息发送的主题和内容

    6 利用Message.saveChanges()来存储填写的邮件信息

    7 根据Session.getTransport("smtp")获取邮件发送类

    8 利用发送人的用户名和密码连接到指定的邮件服务器

    9 将该消息发送

    10 关闭连接

    eg:

    (1)发送一个纯文本邮件

    package mail;
    
    import java.util.Date;
    import java.util.Properties;
    
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.URLName;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    
    /**
     * 邮件发送服务
     */
    public class SendMailService
    {
    
        /**
         * 发送纯文本邮件
         * @param smtpHost 邮件服务器
         * @param to 收件人(可以是多个,使用逗号分隔)
         * @param cc 抄送人(可以是多个,使用逗号分隔)
         * @param bcc密送人(可以是多个,使用逗号分隔)
         * @param sender发件人
         * @param title邮件标题
         * @param content邮件内容
         * @param username邮箱用户名(一般是去掉@之前的那一部分)
         * @param password(邮箱密码)
         * @throws MessagingException
         */
        public static void sendPlainTextEmail(String smtpHost,
                String to,
                String cc,
                String bcc,
                String sender,
                String title,
                String content,
                String username,
                String password
                ) throws MessagingException
        {
            //第一步 利用Properties来设置Session,一般主要设置两个mail.smtp.host和mail.smtp.auth,第一个主要是设置邮件服务器名,第二个是设置口令true或者false
            Properties props = new Properties();
            props.put("mail.host", smtpHost);
            props.put("mail.transport.protocol", "smtp");
            props.put("mail.smtp.auth", "true");
            
            //第二步 利用Session.getInstance(Properties)启动一个与邮件服务器的会话
            Session session = Session.getInstance(props);
            session.setDebug(true);
            
            //第三步 根据获取的Session来传建一个消息Message
            MimeMessage message = new MimeMessage(session);
            
            //第四步 定义消息的发信人地址InternetAddress和消息的收信人地址。
            //发件人
            InternetAddress sendaddr = new InternetAddress(sender);
            message.setFrom(sendaddr);
            //收件人
            InternetAddress[] toaddrs = InternetAddress.parse(to);
            message.setRecipients(Message.RecipientType.TO, toaddrs);
            //抄送人
            InternetAddress[] ccaddrs = InternetAddress.parse(cc);
            message.setRecipients(Message.RecipientType.CC, ccaddrs);
            //密送人
            InternetAddress[] bccaddrs = InternetAddress.parse(bcc);
            message.setRecipients(Message.RecipientType.BCC, bccaddrs);
            //第五步 设置消息发送的主题、内容、时间
            message.setSubject(title);
            message.setText(content);
            message.setSentDate(new Date());
            //第六步 利用Message.saveChanges()来存储填写的邮件信息
            message.saveChanges();
            //第七步 根据Session.getTransport("smtp")获取邮件发送类
            Transport ts = session.getTransport("smtp");
            //第八步 利用发送人的用户名和密码连接到指定的邮件服务器
            ts.connect(smtpHost, username, password);  
            //第九步将该消息发送
            ts.sendMessage(message, message.getAllRecipients());
            //第十步 关闭连接
            ts.close();
        }
        
    }

    (2)先创建已通过身份验证的会话连接 再发送邮件

    package mail;
    
    import javax.mail.Authenticator;
    import javax.mail.PasswordAuthentication;
    
    /**
     * 用户身份认证
     * @author Administrator
     *
     */
    public class SmtpAuth extends Authenticator 
    {
    
        private String username;
        private String password;
        
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
        
        public void setUserinfo(String username,String password)
        {
            this.username = username;
            this.password = password;
        }
    
        protected PasswordAuthentication getPasswordAuthentication()
        {
            return new PasswordAuthentication(username,password);
        }
        
        
    }
    package mail;
    
    import java.util.Date;
    import java.util.Properties;
    
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.URLName;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    
    /**
     * 邮件发送服务
     */
    public class SendMailService
    {
    
        /**
         * 发送纯文本邮件
         * @param smtpHost 邮件服务器
         * @param to 收件人(可以是多个,使用逗号分隔)
         * @param cc 抄送人(可以是多个,使用逗号分隔)
         * @param bcc密送人(可以是多个,使用逗号分隔)
         * @param sender发件人
         * @param title邮件标题
         * @param content邮件内容
         * @param username邮箱用户名(一般是去掉@之前的那一部分)
         * @param password(邮箱密码)
         * @throws MessagingException
         */
        
        public static void sendPlainTextEmailByAuth(String smtpHost,
                String to,
                String cc,
                String bcc,
                String sender,
                String title,
                String content,
                String username,
                String password
                ) throws MessagingException
        {
            //第一步 利用Properties来设置Session,一般主要设置两个mail.smtp.host和mail.smtp.auth,第一个主要是设置邮件服务器名,第二个是设置口令true或者false
                    Properties props = new Properties();
                    props.put("mail.host", smtpHost);
                    props.put("mail.transport.protocol", "smtp");
                    props.put("mail.smtp.auth", "true");
                    
                    //第二步 利用Session.getInstance(Properties)启动一个与邮件服务器的会话
                    SmtpAuth sa = new SmtpAuth();
                    sa.setUserinfo(username, password);
                    //Session session = Session.getInstance(props, sa);
                    Session session = Session.getDefaultInstance(props, sa);
                    session.setPasswordAuthentication(new URLName(smtpHost), sa.getPasswordAuthentication());
                    session.setDebug(true);
                    
                    //第三步 根据获取的Session来传建一个消息Message
                    MimeMessage message = new MimeMessage(session);
                    
                    //第四步 定义消息的发信人地址InternetAddress和消息的收信人地址。
                    //发件人
                    InternetAddress sendaddr = new InternetAddress(sender);
                    message.setFrom(sendaddr);
                    //收件人
                    InternetAddress[] toaddrs = InternetAddress.parse(to);
                    message.setRecipients(Message.RecipientType.TO, toaddrs);
                    //抄送人
                    InternetAddress[] ccaddrs = InternetAddress.parse(cc);
                    message.setRecipients(Message.RecipientType.CC, ccaddrs);
                    //密送人
                    InternetAddress[] bccaddrs = InternetAddress.parse(bcc);
                    message.setRecipients(Message.RecipientType.BCC, bccaddrs);
                    //第五步 设置消息发送的主题、内容、时间
                    message.setSubject(title);
                    message.setText(content);
                    message.setSentDate(new Date());
                    //第六步 利用Message.saveChanges()来存储填写的邮件信息
                    message.saveChanges();
                    //第七步将该消息发送
                    Transport.send(message);
        }
        
        
        public static void main(String[] args) 
        {
            try 
            {
                sendPlainTextEmailByAuth("smtp.163.com", "cac2020@163.com", "ssssss@qq.com", "", "cac2020@163.com", "测试一个纯文本邮件", "ssssss", "cac2020", "ffafasdfsdfsaf");
            } 
            catch (MessagingException e) 
            {
                e.printStackTrace();
            }
            
        }
    
    }

    (3)发送一封含图片的邮件

    package mail;
    
    import java.util.Date;
    import java.util.Properties;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.URLName;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    
    /**
     * 邮件发送服务
     */
    public class SendMailService
    {
    
        
        /**
         * 发送内嵌图片邮件
         * @param smtpHost 邮件服务器
         * @param to 收件人(可以是多个,使用逗号分隔)
         * @param cc 抄送人(可以是多个,使用逗号分隔)
         * @param bcc密送人(可以是多个,使用逗号分隔)
         * @param sender发件人
         * @param title邮件标题
         * @param username邮箱用户名(一般是去掉@之前的那一部分)
         * @param password(邮箱密码)
         * @throws MessagingException
         */
        public static void sendImageEmail(String smtpHost,
                String to,
                String cc,
                String bcc,
                String sender,
                String title,
                String username,
                String password) throws MessagingException
        {
            Properties props = new Properties();
            props.put("mail.host", smtpHost);
            props.put("mail.transport.protocol", "smtp");
            props.put("mail.smtp.auth", "true");
            
            Session session = Session.getDefaultInstance(props);
            session.setDebug(true);
            Transport ts = session.getTransport();
            ts.connect(smtpHost, username, password);
            
            //创建含图片邮件
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(sender));
            msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
            msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));
            msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc));
            msg.setSubject(title);
            msg.setSentDate(new Date());
            
            //邮件正文文本
            MimeBodyPart text = new MimeBodyPart();
            text.setContent("这是一封邮件正文带图片<img src='cid:576f707a5ba85.JPG'>的邮件", "text/html;charset=UTF-8");
            
            //邮件正文中的图片
            MimeBodyPart image = new MimeBodyPart();
            image.setContentID("576f707a5ba85.JPG");
            DataHandler dh = new DataHandler(new FileDataSource("src\576f707a5ba85.JPG"));
            image.setDataHandler(dh);
            
            MimeMultipart mmp = new MimeMultipart();
            mmp.addBodyPart(text);
            mmp.addBodyPart(image);
            mmp.setSubType("related");
            
            msg.setContent(mmp);
            msg.saveChanges();

    ts.sendMessage(msg, msg.getAllRecipients()); ts.close(); } }

    (4)发送包含附件的图片

    package mail;
    
    import java.util.Date;
    import java.util.Properties;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.URLName;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    
    /**
     * 邮件发送服务
     */
    public class SendMailService
    {
    
        /**
         * 发送含附件邮件
         * @param smtpHost 邮件服务器
         * @param to 收件人(可以是多个,使用逗号分隔)
         * @param cc 抄送人(可以是多个,使用逗号分隔)
         * @param bcc密送人(可以是多个,使用逗号分隔)
         * @param sender发件人
         * @param title邮件标题
         * @param username邮箱用户名(一般是去掉@之前的那一部分)
         * @param password(邮箱密码)
         * @throws MessagingException
         */
        public static void sendAttachEmail(String smtpHost,
                String to,
                String cc,
                String bcc,
                String sender,
                String title,
                String username,
                String password) throws MessagingException
        {
            Properties props = new Properties();
            props.put("mail.host", smtpHost);
            props.put("mail.transport.protocol", "smtp");
            props.put("mail.smtp.auth", "true");
            
            Session session = Session.getDefaultInstance(props);
            session.setDebug(true);
            Transport ts = session.getTransport();
            ts.connect(smtpHost, username, password);
            
            //创建含图片邮件
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(sender));
            msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
            msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));
            msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc));
            msg.setSubject(title);
            msg.setSentDate(new Date());
            
            //邮件正文文本
            MimeBodyPart text = new MimeBodyPart();
            text.setContent("使用JavaMail创建的带附件的邮件", "text/html;charset=UTF-8");
            
            //邮件附件
            MimeBodyPart attach = new MimeBodyPart();
            DataHandler dh = new DataHandler(new FileDataSource("src\576f707a5ba85.JPG"));
            attach.setDataHandler(dh);
            attach.setFileName(dh.getName());
            
            //创建个区块之间关系
            MimeMultipart mmp = new MimeMultipart();
            mmp.addBodyPart(text);
            mmp.addBodyPart(attach);
            mmp.setSubType("mixed");
            
            msg.setContent(mmp);
            msg.saveChanges();
            
            ts.sendMessage(msg, msg.getAllRecipients());
            ts.close();
        }
        
    
    }

    (5)发送包含内嵌图片和附件的复杂邮件

    package mail;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.Date;
    import java.util.Properties;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.URLName;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import javax.mail.internet.MimeUtility;
    
    /**
     * 邮件发送服务
     */
    public class SendMailService
    {
    
        
        /**
         * 发送含附件邮件
         * @param smtpHost 邮件服务器
         * @param to 收件人(可以是多个,使用逗号分隔)
         * @param cc 抄送人(可以是多个,使用逗号分隔)
         * @param bcc密送人(可以是多个,使用逗号分隔)
         * @param sender发件人
         * @param title邮件标题
         * @param username邮箱用户名(一般是去掉@之前的那一部分)
         * @param password(邮箱密码)
         * @throws MessagingException
         * @throws IOException 
         * @throws FileNotFoundException 
         */
        public static void sendComplexEmail(String smtpHost,
                String to,
                String cc,
                String bcc,
                String sender,
                String title,
                String username,
                String password) throws MessagingException, FileNotFoundException, IOException
        {
            Properties props = new Properties();
            props.put("mail.host", smtpHost);
            props.put("mail.transport.protocol", "smtp");
            props.put("mail.smtp.auth", "true");
            
            Session session = Session.getDefaultInstance(props);
            session.setDebug(true);
            Transport ts = session.getTransport();
            ts.connect(smtpHost, username, password);
            
            //创建含图片邮件
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(sender));
            msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
            msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));
            msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc));
            msg.setSubject(title);
            msg.setSentDate(new Date());
            
            //邮件正文文本
            MimeBodyPart text = new MimeBodyPart();
            text.setContent("测试<br/><img src='cid:1.PNG'>","text/html;charset=UTF-8");
            
            //图片
            MimeBodyPart image = new MimeBodyPart();
            image.setContentID("1.PNG");
            image.setDataHandler(new DataHandler(new FileDataSource("src\1.PNG")));
            
            //附件1
            MimeBodyPart attach1 = new MimeBodyPart();
            DataHandler dh = new DataHandler(new FileDataSource("src\1.rar"));
            attach1.setDataHandler(dh);
            attach1.setFileName(dh.getName());
            
            //附件2  注意附件名是中文名
            MimeBodyPart attach2 = new MimeBodyPart();
            DataHandler dh2 = new DataHandler(new FileDataSource("src\测试中文附件名.rar"));
            attach2.setDataHandler(dh2);
            attach2.setFileName(MimeUtility.encodeText(dh2.getName()));
            
            //描述关系:正文和图片
            MimeMultipart mp1 = new MimeMultipart();
            mp1.addBodyPart(text);
            mp1.addBodyPart(image);
            mp1.setSubType("related");
            //将正文和图片组合作为一个整体 的正文内容
            MimeBodyPart content = new MimeBodyPart();
            content.setContent(mp1);
            
            //描述关系:正文和附件
            MimeMultipart mp2 = new MimeMultipart();
            mp2.addBodyPart(attach1);
            mp2.addBodyPart(attach2);
            mp2.addBodyPart(content);
            mp2.setSubType("mixed");
            
            //message设置邮件内容
            msg.setContent(mp2);
            msg.saveChanges();
            msg.writeTo(new FileOutputStream("E:\MixedMail.eml"));
            
            ts.sendMessage(msg, msg.getAllRecipients());
            ts.close();
        }
    
    }

    四、使用java mail 接收邮件

    基本步骤:

    1 利用Properties创建一个属性,不需要设置任何属性,之间传递Session使用

    2 Session.getDefaultInstance()获取一个邮件会话

    3 使用该会话向某种提供者请求一个存储库,ss.getStore("pop3");获取一个Store

    4 存储库向指定的邮件服务器建立连接

    5 通过getFolder("INBOX"),获取该存储库中INBOX文件夹

    6 打开INBOX文件夹

    7 消息处理

    8 关闭文件夹

    9 关闭存储库

    package mail;
    
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.Reader;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Enumeration;
    import java.util.Properties;
    
    import javax.mail.Folder;
    import javax.mail.Header;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Session;
    import javax.mail.Store;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeUtility;
    
    public class ReceiveMailService 
    {
    
        public static void receiveMail(String popHost,    String username,String password) throws MessagingException, IOException
        {
            
            //1 利用Properties创建一个属性,不需要设置任何属性,之间传递Session使用
            Properties props = new Properties();
            //props.put("mail.host", smtpHost);
            //props.put("mail.smtp.auth", "true");
            //props.put("mail.transport.protocol", "smtp");
            //props.put("mail.transport.port", "25");
            props.put("mail.store.port", "pop3");
            
            //2 Session.getDefaultInstance()获取一个邮件会话
            Session session = Session.getDefaultInstance(props);
            //3 使用该会话向某种提供者请求一个存储库,ss.getStore("pop3"); 也可以是IMAP 获取一个Store
            Store store = session.getStore("pop3");
            //4 存储库向指定的邮件服务器建立连接
            store.connect(popHost, username, password);
            //5 通过getFolder("INBOX"),获取该存储库中INBOX文件夹
            Folder folder = store.getFolder("INBOX");
            //6 打开INBOX文件夹
            folder.open(Folder.READ_ONLY);
            //7 消息处理
            Message[] messages = folder.getMessages();
            for (int i = 0; i < messages.length; i++) 
            {
                System.out.println("------------Message--" + (i + 1) + "------------");
                // 解析地址为字符串 发件人
                String from = InternetAddress.toString(messages[i].getFrom());
                if (from != null) 
                {
                    String cin = getChineseFrom(from);
                    System.out.println("From:" + cin);
                }
                //回复给发件人
                String replyTo = InternetAddress.toString(messages[i].getReplyTo());
                if (replyTo != null)
                {
                    String rest = getChineseFrom(replyTo);
                    System.out.println("Reply To:" + rest);
                   }
                //
                String to = InternetAddress.toString(messages[i].getRecipients(Message.RecipientType.TO));
                if (to != null)
                {
                    String tos = getChineseFrom(to);
                    System.out.println("To:" + tos);
                }
                //邮件主题
                String subject = messages[i].getSubject();
                if (subject != null)
                {
                    System.out.println("Subject:" + subject);
                }
                //发送日期 
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date sent = messages[i].getSentDate();
                if (sent != null)
                {
                    System.out.println("Sent Date:" + sdf.format(sent));
                }
                //接收日期
                Date ress = messages[i].getReceivedDate();
                if (ress != null)
                {
                    System.out.println("Receive Date:" + sdf.format(ress));
                }
                   
                // 显示消息的所有首部信息
                Enumeration<Header> headers = messages[i].getAllHeaders();
                while(headers.hasMoreElements())
                {
                    Header h=(Header)headers.nextElement();
                    String res=h.getName();
                    String val=h.getValue();
                    System.out.println(res+":"+val);
                }
                 System.out.println();
                 //读取消息主题部分
                 Object content = messages[i].getContent();
                 System.out.println(content);
                 //根据指定的编码格式读出内容
                 Reader read = new InputStreamReader(messages[i].getInputStream());
                 int a=0;
                 while((a=read.read())!=-1)
                 {
                     System.out.print((char)a);
                 }
                 //获取该消息的类型
                 String type=messages[i].getContentType();
                 String sender=InternetAddress.toString(messages[i].getFrom());
                 System.out.println("Sender:"+sender);
                 System.out.println("Content-type:"+type);
            }
            //8 关闭文件夹但不删除服务器上的消息 false代表不是删除
            folder.close(false);//当为true时会删掉已经标记为删除的邮件
            //9 关闭存储库
            store.close();
        }
        
        // 解决中文乱码问题
        public static String getChineseFrom(String res)
        {
            String from = res;
            try 
            {
                if (from.startsWith("=?GB") || from.startsWith("=?gb") || from.startsWith("=?UTF")) 
                {
                    from = MimeUtility.decodeText(from);
                } 
                else 
                {
                    from = new String(from.getBytes("ISO8859_1"), "GBK");
                }
            } 
            catch (Exception e) 
            {
                e.printStackTrace();
            }
            
            return from;
        }
        
        public static void main(String[] args)
        {
            try 
            {
                receiveMail("pop3.163.com", "cac2020", "fadgfjkssdfkasjg");
            } 
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    
    }

    参考:

    http://blog.csdn.net/ghsau/article/details/17839983

    http://www.cnblogs.com/xdp-gacl/p/4216311.html

    http://computerdragon.blog.51cto.com/6235984/1197390

    http://blog.sina.com.cn/s/blog_67196ddc0101fdrn.html

  • 相关阅读:
    SVN的安装和使用手册2
    svn安装
    【1】第一篇 Postman的初级使用之设置环境快速切换生成环境与测试环境
    【4】Postman之Tests(断言)
    RIDE,如何指定report,log,output的存放位置
    python启动robotframework-ride失败,解决方案
    Python安装第三库超时的解决方法
    python 识别登陆验证码图片(完整代码)
    代码-字典
    Python数据分析入门
  • 原文地址:https://www.cnblogs.com/cac2020/p/5997238.html
Copyright © 2011-2022 走看看