精华内容
下载资源
问答
  • java实现动态多样性
    千次阅读
    2021-02-12 10:24:44

    核心:

    1、多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

    2、指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)

    3、在继承链中对象方法的调用存在一个优先级:this.show(O)、super.show(O)、

    this.show((super)O)、super.show((super)O)。即先查this对象的父类,没有就重头再查参数的父类

    一、什么是多态面向对象的三大特性:封装、继承、多态

    多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

    实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

    多态的作用:消除类型之间的耦合关系。

    现实中,关于多态的例子不胜枚举。比方说按下 F1键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。

    下面是多态存在的三个必要条件,要求大家做梦时都能背出来!

    多态存在的三个必要条件

    一、要有继承;

    二、要有重写;

    三、父类引用指向子类对象。

    二、多态的好处:

    1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。

    2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。

    3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。

    4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。

    5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

    Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。

    三、经典实例。

    public class A {

    public String show(D obj) {

    return ("A and D");

    }

    public String show(A obj) {

    return ("A and A");

    }

    }

    public class B extends A{

    public String show(B obj){

    return ("B and B");

    }

    public String show(A obj){

    return ("B and A");

    }

    }

    public class C extends B{

    }

    public class D extends B{

    }

    public class Test {

    public static void main(String[] args) {

    A a1 = new A();

    A a2 = new B();

    B b = new B();

    C c = new C();

    D d = new D();

    System.out.println("1--" + a1.show(b));

    System.out.println("2--" + a1.show(c));

    System.out.println("3--" + a1.show(d));

    System.out.println("4--" + a2.show(b)); //4--B and A .首先a2是A引用,B实例,调用show(B b)方法,此方法在父类A中没有定义,所以B中方法show(B b)不会调用(多态必须父类中已定义该方法),再按优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O),即先查this对象的父类,没有重头再查参数的父类。查找super.show((super)O)时,B中没有,再向上,找到A中show(A a),因此执行。

    System.out.println("5--" + a2.show(c)); //同上 System.out.println("6--" + a2.show(d)); //A and D .查找B中没有show(D d)方法,再查A中,有,执行。 System.out.println("7--" + b.show(b));

    System.out.println("8--" + b.show(c)); //B and B . System.out.println("9--" + b.show(d));

    }

    }

    运行结果:

    1--A and A

    2--A and A

    3--A and D

    4--B and A

    5--B and A

    6--A and D

    7--B and B

    8--B and B

    9--A and D

    来源:CSDN

    作者:JIAN_BOY_RISE

    声明:(本文二次转载,原文不可查)

    更多相关内容
  • RankSys:Java 8推荐系统框架,具有新颖性,多样... 该框架的公开版本(0.4.3)包括几种协作过滤推荐算法的实现,以及各种新颖性和多样性指标以及重新排序技术。 迄今为止发布的模块如下: RankSys核心:框架的通用和
  • java实现excel动态表头导入

    千次阅读 2019-06-19 10:13:47
    使用java在导入excel表格时,一般采用hssfworkbook(excel2003)和xssfworkbook(excel2007) 首先获取workbook: /** * 描述:根据文件后缀,自适应上传文件的版本 * * @param inStr 将file.getInputStream()...

    问题的提出

    使用java在导入excel表格时,一般采用hssfworkbook(excel2003)和xssfworkbook(excel2007)
    首先获取workbook:

    /**
    	 * 描述:根据文件后缀,自适应上传文件的版本
    	 * 
    	 * @param inStr    将file.getInputStream()获取的输入流
    	 * @param fileName file.getOriginalFilename()获取的原文件名
    	 */
    	public static Workbook getWorkbook(InputStream inStr, String fileName) throws Exception {
    		Workbook wb = null;
    		String fileType = fileName.substring(fileName.lastIndexOf("."));
    		if (excel2003L.equals(fileType)) {
    			wb = new HSSFWorkbook(inStr); // 2003-
    		} else if (excel2007U.equals(fileType)) {
    			wb = new XSSFWorkbook(inStr); // 2007+
    		} else {
    			throw new Exception("解析的文件格式有误!");
    		}
    		return wb;
    	}
    

    使用List<List>类型存储读取到的数据

    /**
     * 
     * 读取指定sheet 页指定行数据
     * 
     * @param sheetIx  指定 sheet 页,从 0 开始
     * @param startRow 指定开始行,从 0 开始
     * @param endRow   指定结束行,从 0 开始 start=end=0 就是第一行
     * @param startCol 指定开始列
     * @param startCol 指定结束列
     * @return
     * @throws Exception
     */
    public List<List<String>> read(int sheetIx, int startRow, int endRow, int startCol, int endCols) throws Exception {
    	Sheet sheet = workbook.getSheetAt(sheetIx);
    	List<List<String>> list = new ArrayList<List<String>>();
    
    	if (endRow > getRowCount(sheetIx)) {
    		endRow = getRowCount(sheetIx);
    	}
    
    	for (int i = startRow; i <= endRow; i++) {
    		List<String> rowList = new ArrayList<String>();
    		Row row = sheet.getRow(i);
    		for (int j = startCol; j < endCols; j++) {
    			if (row == null) {
    				rowList.add(null);
    				continue;
    			}
    			//rowList.add(getCellValue(row.getCell(j)));
    			//取excel表中公式数据 ,表格中row.getCell(j).getCellTypeEnum() 可能会发生空指针错误,用try...catch处理
    			try {
    		        if (row.getCell(j).getCellTypeEnum() == CellType.FORMULA) {
    		        	row.getCell(j).setCellType(CellType.STRING);
    		            rowList.add(row.getCell(j).getStringCellValue());
    		        }else {
    		        	rowList.add(getCellValueToString(row.getCell(j)));
    		        }
    			}catch(Exception e) {
    				rowList.add(getCellValueToString(row.getCell(j)));
    			}
    		}
    		list.add(rowList);
    	}
    	return list;
    }
    

    这样是一般的处理过程,这样处理有个不好的地方就是拓展性不强,在后续调用List<List>数据时需知道在第几列,最致命的是表格添加字段或删除字段后,所有序号都得修改,所以需要解决这一问题。

    问题的解决

    本文新建工具类,采用反射技术动态的提取类方法

    public class ArUtils<T> {
    	
    	private String[] ldcode = {"Id","Name", "A","B","C","D","E","F",
    	                           "AtpDeviceNo2","AtpDeviceNo16","Tpproperty1","Tpproperty2",
    	                           "Tpproperty3","Tpproperty4","Tpproperty5","Tpproperty6","Tpproperty7",
    	                           "Remarks"};
    	
    	private String id;
    	
    	private String name;
    	
    	private String a;
    	
    	private String b;
    

    配置各私有属性的get,set方法。

    /**
     * 
     * 读取指定sheet 页指定行<T>数据
     * 
     * @param sheetIx 指定 sheet 页,从 0 开始
     * @param start   指定开始行,从 0 开始
     * @param end     指定结束行,从 0 开始
     * @return
     * @throws Exception
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public List<List<T>> readGeneric(int sheetIx, int start, int end, T t) throws Exception {
    	Sheet sheet = workbook.getSheetAt(sheetIx);
    	List<List<T>> list = new ArrayList<List<T>>();
    
    	if (end > getRowCount(sheetIx)) {
    		end = getRowCount(sheetIx);
    	}
    
    	for (int i = start; i <= end; i++) {
    		List<T> rowList = new ArrayList<T>();
    		Row row = sheet.getRow(i);
    		List rowdata = getRowdata(row);
    		Class clazz = t.getClass();
    		Object fa= clazz.newInstance();
    		Method method = t.getClass().getMethod("getLdcode", new Class[]{});
    		Object[] ldcode = (String[])method.invoke(fa, new Object[]{});
    		
    		for(int j = 0; j < rowdata.size(); j++) {
    			method = t.getClass().getMethod("set"+ldcode[j], String.class);
    			method.invoke(fa, rowdata.get(j));
    		}
    		rowList.add((T) fa);
    		list.add(rowList);
    	}
    
    	return list;
    }
    

    首先反射获取string[]数组,数组中存储着各个私有属性,再调用个各属性的set方法,将一行数据存储进工具类的实例,这样就完成了键值对存储,之后调用时直接使用工具类的get方法就好了。

    展开全文
  • JAVA实现邮件发送

    万次阅读 多人点赞 2020-07-04 22:52:37
    要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。 SMTP服务器地址:一般是 smtp.xxx.com,...

    一、邮件服务器与传输协议

    要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

    SMTP有关的详细内容可以看看   《TCP/IP详解  卷一》   第28章会比较清晰,这里有一个地址,可以看看   第28章 SMTP:简单邮件传送协议_《TCP/IP详解 卷1:协议》_即时通讯网(52im.net) _即时通讯开发者社区!

    SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。

    SMTP协议:通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

    POP3协议:通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

    二、Java发送邮件

    在这里插入图片描述

    JAVA邮件发送的大致过程是这样的的:
    1、构建一个继承自javax.mail.Authenticator的具体类,并重写里面的getPasswordAuthentication()方法。此类是用作登录校验的,以确保你对该邮箱有发送邮件的权利。
    2、构建一个properties文件,该文件中存放SMTP服务器地址等参数。
    3、通过构建的properties文件和javax.mail.Authenticator具体类来创建一个javax.mail.Session。Session的创建,就相当于登录邮箱一样。剩下的自然就是新建邮件。
    4、构建邮件内容,一般是javax.mail.internet.MimeMessage对象,并指定发送人,收信人,主题,内容等等。
    5、使用javax.mail.Transport工具类发送邮件。

    使用到的jar包:

    mail.jar
    activation.jar
    QQ邮箱需获取相应的权限:

    QQ邮箱–>邮箱设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启POP3/SMTP服务,然后获取16位授权码(注意不要将授权码泄露,一个账户可以拥有多个授权码)

    在这里插入图片描述

    2.1 Java实现纯文本邮件发送

    package org.westos.email;
    
    import com.sun.mail.util.MailSSLSocketFactory;
    
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.security.GeneralSecurityException;
    import java.util.Properties;
    
    public class SendEamil {
        public static void main(String[] args) throws MessagingException, GeneralSecurityException {
            //创建一个配置文件并保存
            Properties properties = new Properties();
    
            properties.setProperty("mail.host","smtp.qq.com");
    
            properties.setProperty("mail.transport.protocol","smtp");
    
            properties.setProperty("mail.smtp.auth","true");
    
    
            //QQ存在一个特性设置SSL加密
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            properties.put("mail.smtp.ssl.enable", "true");
            properties.put("mail.smtp.ssl.socketFactory", sf);
    
            //创建一个session对象
            Session session = Session.getDefaultInstance(properties, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("619046217@qq.com","16位授权码");
                }
            });
    
            //开启debug模式
            session.setDebug(true);
    
            //获取连接对象
            Transport transport = session.getTransport();
    
            //连接服务器
            transport.connect("smtp.qq.com","619046217@qq.com","16位授权码");
    
            //创建邮件对象
            MimeMessage mimeMessage = new MimeMessage(session);
    
            //邮件发送人
            mimeMessage.setFrom(new InternetAddress("619046217@qq.com"));
    
            //邮件接收人
            mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("875203654@qq.com"));
    
            //邮件标题
            mimeMessage.setSubject("Hello Mail");
    
            //邮件内容
            mimeMessage.setContent("我的想法是把代码放进一个循环里","text/html;charset=UTF-8");
    
            //发送邮件
            transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
    
            //关闭连接
            transport.close();
        }
    }


    2.2Java实现文本图片附件复杂的邮件发送

    MIME(多用途互联网邮件扩展类型)

    MimeBodyPart类

    javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。

    MimeMultipart类

    javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象

    package org.westos.email;
    
    import com.sun.mail.util.MailSSLSocketFactory;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.*;
    import javax.mail.internet.*;
    import java.security.GeneralSecurityException;
    import java.util.Properties;
    
    public class SendComplexEmail {
        public static void main(String[] args) throws GeneralSecurityException, MessagingException {
            Properties prop = new Properties();
            prop.setProperty("mail.host", "smtp.qq.com"); // 设置QQ邮件服务器
            //prop.setProperty("mail.smtp.port", "25"); // 当使用公司内部邮箱,可以设置端口
            //prop.setProperty("mail.smtp.host", "smtp.qq.com"); // 当使用公司内部邮箱,可以设置服务器
            prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
            prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码
    
            // QQ邮箱设置SSL加密(可以不改)
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            prop.put("mail.smtp.ssl.enable", "true");
            prop.put("mail.smtp.ssl.socketFactory", sf);
    
            //1、创建定义整个应用程序所需的环境信息的 Session 对象
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    //传入发件人的姓名和授权码
                    return new PasswordAuthentication("619046217@qq.com","16位授权码");
                }
            });
    
            //2、通过session获取transport对象
            Transport transport = session.getTransport();
    
            //3、通过transport对象邮箱用户名和授权码连接邮箱服务器
            transport.connect("smtp.qq.com","619046217@qq.com","16位授权码");
    
            //4、创建邮件,传入session对象
            MimeMessage mimeMessage = complexEmail(session);
    
            //5、发送邮件
            transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
    
            //6、关闭连接
            transport.close();
    
    
        }
    
        public static MimeMessage complexEmail(Session session) throws MessagingException {
            //消息的固定信息
            MimeMessage mimeMessage = new MimeMessage(session);
    
            //发件人
            mimeMessage.setFrom(new InternetAddress("619046217@qq.com"));
            //收件人
            mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("619046217@qq.com"));
            //邮件标题
            mimeMessage.setSubject("带图片和附件的邮件");
    
            //邮件内容
            //准备图片数据
            MimeBodyPart image = new MimeBodyPart();
            DataHandler handler = new DataHandler(new FileDataSource("E:\\IdeaProjects\\WebEmail\\resources\\测试图片.png"));
            image.setDataHandler(handler);
            image.setContentID("test.png"); //设置图片id
    
            //准备文本
            MimeBodyPart text = new MimeBodyPart();
            text.setContent("这是一段文本<img src='cid:test.png'>","text/html;charset=utf-8");
    
            //附件
            MimeBodyPart appendix = new MimeBodyPart();
            appendix.setDataHandler(new DataHandler(new FileDataSource("E:\\IdeaProjects\\WebEmail\\resources\\测试文件.txt")));
            appendix.setFileName("test.txt");
    
            //拼装邮件正文
            MimeMultipart mimeMultipart = new MimeMultipart();
            mimeMultipart.addBodyPart(image);
            mimeMultipart.addBodyPart(text);
            mimeMultipart.setSubType("related");//文本和图片内嵌成功
    
            //将拼装好的正文内容设置为主体
            MimeBodyPart contentText = new MimeBodyPart();
            contentText.setContent(mimeMultipart);
    
            //拼接附件
            MimeMultipart allFile = new MimeMultipart();
            allFile.addBodyPart(appendix);//附件
            allFile.addBodyPart(contentText);//正文
            allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed
    
    
            //放到Message消息中
            mimeMessage.setContent(allFile);
            mimeMessage.saveChanges();//保存修改
    
            return mimeMessage;
        }
    }


    2.3 JavaWeb发送邮件(网站注册成功发送提示邮件)

    2.3.1 User

    package org.westos.mail;
    
    public class User {
        private String name;
        private String password;
        private String mail;
    
        public User() {
        }
    
        public User(String name, String password, String mail) {
            this.name = name;
            this.password = password;
            this.mail = mail;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getMail() {
            return mail;
        }
    
        public void setMail(String mail) {
            this.mail = mail;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", password='" + password + '\'' +
                    ", mail='" + mail + '\'' +
                    '}';
        }
    }


    2.3.2 Servlet

    package org.westos.mail;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class Servlet extends javax.servlet.http.HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request,response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) {
            //处理前端请求
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String email = request.getParameter("email");
    
            //将信息封装进user对象
            User user = new User(username, password, email);
    
            SendMail sendMail = new SendMail(user);
            sendMail.start(); //开启线程
    
            request.setAttribute("msg","发送成功");
            try {
                request.getRequestDispatcher("msg.jsp").forward(request,response);
            } catch (ServletException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    
        }
    }


    2.3.3 SengMail

    package org.westos.mail;
    
    import com.sun.mail.util.MailSSLSocketFactory;
    
    import javax.mail.*;
    import javax.mail.internet.AddressException;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.security.GeneralSecurityException;
    import java.security.PublicKey;
    import java.util.Properties;
    
    public class SendMail extends Thread {
        //发件人信息
        private String From = "619046217@qq.com";
        //发件人邮箱
        private String recipient = "619046217@qq.com";
        //邮箱密码
        private String password = "16位授权码";
        //邮件发送的服务器
        private String host = "smtp.qq.com";
    
        //收件人信息
        private User user;
        public SendMail(User user){
            this.user = user;
        }
    
        @Override
        public void run() {
            try {
                Properties properties = new Properties();
    
                properties.setProperty("mail.host","smtp.qq.com");
    
                properties.setProperty("mail.transport.protocol","smtp");
    
                properties.setProperty("mail.smtp.auth","true");
    
                //QQ存在一个特性设置SSL加密
                MailSSLSocketFactory sf = null;
                try {
                    sf = new MailSSLSocketFactory();
                } catch (GeneralSecurityException e) {
                    e.printStackTrace();
                }
                sf.setTrustAllHosts(true);
                properties.put("mail.smtp.ssl.enable", "true");
                properties.put("mail.smtp.ssl.socketFactory", sf);
    
                //创建一个session对象
                Session session = Session.getDefaultInstance(properties, new Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(recipient,password);
                    }
                });
    
                //开启debug模式
                session.setDebug(true);
    
                //获取连接对象
                Transport transport = null;
                try {
                    transport = session.getTransport();
                } catch (NoSuchProviderException e) {
                    e.printStackTrace();
                }
    
                //连接服务器
                transport.connect(host,From,password);
    
    
                //创建一个邮件发送对象
                MimeMessage mimeMessage = new MimeMessage(session);
                //邮件发送人
                mimeMessage.setFrom(new InternetAddress(recipient));
    
                //邮件接收人
                mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getMail()));
    
                //邮件标题
                mimeMessage.setSubject("网站注册成功");
    
                //邮件内容
                mimeMessage.setContent("网站注册成功,密码为"+user.getPassword()+",请妥善保管密码","text/html;charset=UTF-8");
    
                //发送邮件
                transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
    
                transport.close();
    
            }catch (Exception e){
                e.printStackTrace();
            }
    
        }
    
    }


    2.3.4 register.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>注册页面</title>
    </head>
    <body>
    
    <form action="${pageContext.request.contextPath}/a.do" method="post">
        <p>用户名:<input type="text" name="username" required></p>
        <p>密码:<input type="password" name="password" required></p>
        <p>邮箱:<input type="email" name="email" required></p>
        <p><input type="submit" value="提交"></p>
    </form>
    </body>
    </html>

    2.3.5 msg.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    ${msg}
    </body>
    </html>

    2.3.6 web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <servlet>
            <servlet-name>Servlet</servlet-name>
            <servlet-class>org.westos.mail.Servlet</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>Servlet</servlet-name>
            <url-pattern>/a.do</url-pattern>
        </servlet-mapping>
    </web-app>

    可能遇到的问题

    1.没有这两个JAR包

    mail.jar    Download javax.mail.jar : javax.mail « j « Jar File Download
    activation.jar       Download javax.activation-3.0-prelude.jar : javax.activation « j « Jar File Download

    下面的报错需要开启debug模式

    Session sendMailSession = Session.getInstance(pro, authenticator);
    sendMailSession.setDebug(true);

    2.

    javax.mail.MessagingException: IOException while sending message; nested exception is: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed;

    解决方法,加这个代码

    参考链接

    jakarta mail - MessagingExceptionIOException while sending message in java? - Stack Overflow

    import javax.activation.CommandMap;
    import javax.activation.MailcapCommandMap;
    
    MailcapCommandMap mailcapCommandMap = new MailcapCommandMap();
    		mailcapCommandMap.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
    		mailcapCommandMap.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
    		mailcapCommandMap.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
    		mailcapCommandMap.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
    		mailcapCommandMap.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
    		Thread.currentThread().setContextClassLoader(类名.class.getClassLoader());    

    3.

    javax.mail.MessagingException: IOException while sending message;
      nested exception is:
     java.net.SocketException: Connection reset by peer: socket write error


    一般是邮箱对附件大小有限制

    QQ和163一般是50M

    解决方法1

    1.压缩附件或者删掉不必要项,尽可能使附件小于50M;

    2.寻找其他附件支持大于50M的邮箱账号来进行发送;一般139邮件的最大附件不超过60M,看下是否满足。

    解决方法2

    参考 javax.mail.MessagingException: while sending message;Connection reset by peer: socket write error_烤鸭的世界我们不懂的博客-CSDN博客

    4.

    org.springframework.mail.MailSendException: Failed messages: javax.mail.MessagingException: Exception reading response (java.net.SocketTimeoutException: Read timed out)
        at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:448) ~[spring-context-support-4.1.0.RELEASE.jar:4.1.0.RELEASE]
        at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:346) ~[spring-context-support-4.1.0.RELEASE.jar:4.1.0.RELEASE]
        at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:341) ~[spring-context-support-4.1.0.RELEASE.jar:4.1.0.RELEASE]

    解决方式

    5.

    javax.mail.MessagingException: Could not connect to SMTP host: crmail.crc.com.cn, port: 25, response: -1. 

    服务器有问题,可能有个地方被墙了

    DEBUG SMTP: IOException while sending, closing, THROW: 
    java.io.IOException: javax.mail.MessagingException: No MimeBodyPart content
        at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:105)
        at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:889)
        at javax.activation.DataHandler.writeTo(DataHandler.java:317)
        at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1485)
        at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1773)
        at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1119)
        at com.etc.email.EmailTest.sendEmailTest(EmailTest.java:104)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:73)
        at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:83)
        at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
        at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
        at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
        at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
        at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
        at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
        at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

    代码的问题,建议找一个其他正确的

    以下这部分参考:

    JavaMail邮件发送不成功的那些坑人情况及分析说明 - JackFe - 博客园

    6、后台显示邮件发送成功但未收到邮件

    问题现象

      使用新浪邮箱发送邮件,尝试两种邮件发送方式,分别是“A@sina .cn发送给A@sina .cn”和“A@sina .cn发送给B@sina .cn”,摘要部分后台打印信息:

    250 ok queue id 355937395546
    QUIT
    221 smtp-5-121.smtpsmail.fmail.xd.sinanode.com
    Sent message ***@sina.cn successfully....
    

      使用163邮箱发送邮件,尝试C@126.com发送给A@sina .cn,摘要部分后台打印信息:

    250 Mail OK queued as smtp7,C8CowADnDNooqmNYHWsYGw--.30359S3 1482926655
    QUIT
    221 Bye
    Sent message ***@sina.cn successfully....
    

      登录新浪邮箱确认有smtp服务且处于开通状态,也尝试重新开启smtp服务,仍然邮件发送不成功。网上也有不少人反馈用手机客户端无法使用新浪邮箱发送邮件,随后我尝试用foxmail登录新浪邮箱,也出现只能接收邮件而不能发送邮件的情况。

    问题分析

      基本确定是新浪邮箱问题,至于是smtp服务问题,还是做什么限制就不清楚了。好像平时也没多少人用新浪邮箱发邮件,通过网页登录也是能发邮件的,凑合能用,毕竟是免费邮箱嘛。

      这是用JavaMail发送邮件遭遇的第一个问题,案例都是参考别人原封不动拿过来用的,却发了收不到邮件。换了几个参考案例,问题现象相同。我开始怀疑别人给的案例代码问题,毕竟堂堂的新浪邮箱还不至于这么不靠谱。然后,就是基于这样的判断,我就吃了大亏,一直在分析代码和配置方式,也在各大论坛搜“发送邮件成功却收不到邮件”,发现出现问题的不在少数,而且多半给出的建议是检查代码有没有问题,然后提问的人也没了回复下文,这就导致了很大的误导性。这正是因为这个原因,我也白白地耗了好几天时间,直到最后发现原来原因是这么简单...有时别人的解答能够事半功倍,但是这种依赖性还是不靠谱的,有时自己的排错思路更重要

    7、向新浪邮箱发信被退信

    问题现象

      平时开发测试,不想用私人常用邮箱,于是注册了搜狐邮箱,并尝试向新浪邮箱发送邮件,不过很快搜狐邮箱收到退信(这种情况JavaMail是不会提示判断信息的),退信内容如下:

    <A@sina .cn>: host freemx1.sinamail.sina.com.cn[202.108.35.47] said:
    554 Rejected due to the sending MTA's poor reputation. Please refer
    http://mail.sina.com.cn/help2... Please refer to
    http://chengxin.mail.sina.com... 123.125.123.1
    (in reply to DATA command)

    问题分析

      通过访问退信信息里面的链接(新浪邮箱诚信平台),基本确定搜狐邮箱服务器被拉黑了。当然,不是被新浪拉黑,而是进了RBL黑名单,新浪参考其数据进行了屏蔽。这个已经超出了个人能力范围,果断放弃新浪邮箱,改向其他邮箱发送。

    【RBL黑名单】

    RBL是英文Realtime BlackholeList的缩写,即实时黑名单列表。在该列表中的IP地址对外发布过垃圾邮件。是由第三方的反垃圾邮件组织提供的检查垃圾邮件发送者地址的服务。

    【查询网站】

    MXToolBox:MX Lookup Tool - Check your DNS MX Records online - MxToolbox 
    BlackListAlert:BLACKLISTALERT.ORG - Email Problem ? - Test if your IP or DOMAIN is blacklisted in a spamdatabase

    8、向163邮箱发信未收到且也无未退信

    问题现象

      通过搜狐邮箱向新浪邮箱发信遭遇退信后,我尝试自己发给自己,正常收到邮件。考虑模拟测试要尽量真实,我改向163邮箱发信,结果出现后台显示发信成功,163邮箱却没收到邮件,但本地邮箱并没收到退信通知。

    问题分析

      这说明“后台显示邮件发送成功但未收到邮件”的情况,原因还是多种多样的,不仅可能发件服务器有问题,还可能是收件服务器的问题。收件服务器有的给你退信,有的还收了直接丢弃,真是什么奇葩情况都有,多加注意吧。

    9、jar包重叠存在javax.mail.*

    问题现象

      从Oracle官网下载下来JavaMail相关jar包是mail.jar,导入进去测试后报各种奇葩错误。下面的异常信息是在项目中已有geronimo-javamail_1.4_spec-1.3.jar的情况下导入mail.jar后报出来的:

    com.sun.mail.smtp.SMTPSendFailedException: 530 Authentication required
     at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)
     at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959)
     at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)
    

      不仔细看还以为是账号或密码填错了,其实只要把geronimo-javamail_1.4_spec-1.3.jar剔除,重新发邮件就正常了。

    问题分析

      上面只是我贴出来的报错情况之一,这些报错是不一定能够复现,因为导包就存在问题,重叠存在javax.mail.*。我是在出现第一个问题(“后台显示邮件发送成功但未收到邮件”)的时候,在网上看到别人说的这种情况(javaMail发送邮件成功却收不到邮件或收到邮件无主题无收件人乱码),而后我就开始逐个排查定位,目前通过我所知道的情况来看,重叠存在javax.mail.*的jar有mail.jar、geronimo-javamail_1.4_spec-1.x.jar、mailapi.jar和javaee.jar。
      排查的方法也很简单,比如打开javax.mail.Session,然后定位它所在的jar,剔除后再找下一个jar包。

    10、jar包正确的情况下也出现报错

    问题现象

      在jar包正常且配置正确的情况下,我也遇到过不少报错情况。出现的情况基本是前几次发邮件都正常,然后再发一次又突然出现报错,再试一次问题又不复现,贴出几种报错信息如下:

    (报错1)

    DEBUG SMTP: Sending failed because of invalid destination addresses
    RSET
    DEBUG SMTP: MessagingException while sending, THROW: 
    javax.mail.SendFailedException: Invalid Addresses;
      nested exception is:
        com.sun.mail.smtp.SMTPAddressFailedException: 554 5.7.1 <*@163.com>: Relay access denied
        at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1862)
        at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1118)

    (报错2)

    Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: Could not convert socket to TLS;
      nested exception is:
        javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed

    (报错3)

    javax.mail.SendFailedException: Send failure (javax.mail.MessagingException: Could not connect to SMTP host: smtp.sohu.com, port: 25 (java.net.ConnectException: Connection timed out: connect))
        at javax.mail.Transport.send(Transport.java:163)
        at javax.mail.Transport.send(Transport.java:48)
        at javamail.EmailSender.sendMail(EmailSender.java:91)
        at javamail.EmailSender.main(EmailSender.java:64)

    (报错4)

    250-zw_71_47
    250-AUTH PLAIN LOGIN
    250 STARTTLS
    DEBUG SMTP: Found extension "AUTH", arg "PLAIN LOGIN"
    DEBUG SMTP: Found extension "STARTTLS", arg ""
    DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM 
    DEBUG SMTP: AUTH LOGIN command trace suppressed
    

    问题分析

      因为这些报错不具有可复现性,测试过程中我也司空见惯,当然90%以上的情况邮件发送都是正常,代码方面也是综合了多个案例提炼出来的,而且代码大同小异,也看过官方提供的样例,配置内容都差不多,代码问题可能性较小,也不排除smtp服务器抽风了,目前我暂时忽略。   当然,如果有分析出是代码问题,也欢迎留言告知分享。(注:后面文章我会将我的代码粘贴出来共享)

    11、发信成功后,回应的信息不同

    问题现象

      我将JavaMail代码在外网测试邮件发送成功时,后台打印信息结尾内容基本如下:

    250 Mail OK queued as smtp7,C8CowADnDNooqmNYHWsYGw--.30359S3 1482926655
    QUIT
    221 Bye

      当我将JavaMail代码移植到内部环境测试邮件发送成功时,后台打印信息结尾内容如下:

    250 Message accepted for delivery
    QUIT
    221 srv201.mail.*.* SMTP Service closing transmission channel
    

    问题分析

      通过上网查询资料得知,250和221这样的编码实际是smtp交互的消息编码,其中221代表邮件会话即将结束,这意味着所有消息都已被处理。编码后面的信息“srv201.mail.. SMTP Service closing transmission channel”和“Bye”的意思类似,可以忽略具体内容,知道221代表邮件发送正常即可。

    12.

    DATA
    421 4.4.5 HL:ICC .For more information, please visit https://feedback.qiye.163.com/bounce/ABFBVSMHL1UjWg5deEB4cQYGBS0%2FeFQnbkxEXUch
    DEBUG SMTP: got response code 421, with response: 421 4.4.5 HL:ICC .For more information, please visit https://feedback.qiye.163.com/bounce/ABFBVSMHL1UjWg5deEB4cQYGBS0%2FeFQnbkxEXUch
     
    RSET
    DEBUG SMTP: EOF: [EOF]
    DEBUG SMTP: MessagingException while sending, THROW: 
    com.sun.mail.smtp.SMTPSendFailedException: 421 4.4.5 HL:ICC .For more information, please visit https://feedback.qiye.163.com/bounce/ABFBVSMHL1UjWg5deEB4cQYGBS0%2FeFQnbkxEXUch
     
        at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2108)
        at com.sun.mail.smtp.SMTPTransport.data(SMTPTransport.java:1876)
        at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1119)
        at com.etc.email.EmailTest.sendEmailTest(EmailTest.java:104)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:73)
        at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:83)
        at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
        at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
        at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
        at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
        at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
        at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
        at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

    •421 HL:REP 该IP发送行为异常,存在接收者大量不存在情况,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并核对发送列表有效性;
    •421 HL:ICC 该IP同时并发连接数过大,超过了网易的限制,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并降低IP并发连接数量;
    •421 HL:IFC 该IP短期内发送了大量信件,超过了网易的限制,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并降低发送频率;
    •421 HL:MEP 该IP发送行为异常,存在大量伪造发送域域名行为,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并使用真实有效的域名发送;

    更多错误码的介绍:

      •421 HL:REP 该IP发送行为异常,存在接收者大量不存在情况,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并核对发送列表有效性;
      •421 HL:ICC 该IP同时并发连接数过大,超过了网易的限制,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并降低IP并发连接数量;
      •421 HL:IFC 该IP短期内发送了大量信件,超过了网易的限制,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并降低发送频率;
      •421 HL:MEP 该IP发送行为异常,存在大量伪造发送域域名行为,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并使用真实有效的域名发送;
      •450 MI:CEL 发送方出现过多的错误指令。请检查发信程序;
      •450 MI:DMC 当前连接发送的邮件数量超出限制。请减少每次连接中投递的邮件数量;
      •450 MI:CCL 发送方发送超出正常的指令数量。请检查发信程序;
      •450 RP:DRC 当前连接发送的收件人数量超出限制。请控制每次连接投递的邮件数量;
      •450 RP:CCL 发送方发送超出正常的指令数量。请检查发信程序;
      •450 DT:RBL 发信IP位于一个或多个RBL里。请参考http://www.rbls.org/关于RBL的相关信息;
      •450 WM:BLI 该IP不在网易允许的发送地址列表里;
      •450 WM:BLU 此用户不在网易允许的发信用户列表里;
      •451 DT:SPM ,please try again 邮件正文带有垃圾邮件特征或发送环境缺乏规范性,被临时拒收。请保持邮件队列,两分钟后重投邮件。需调整邮件内容或优化发送环境;
      •451 Requested mail action not taken: too much fail authentication 登录失败次数过多,被临时禁止登录。请检查密码与帐号验证设置;
      •451 RP:CEL 发送方出现过多的错误指令。请检查发信程序;
      •451 MI:DMC 当前连接发送的邮件数量超出限制。请控制每次连接中投递的邮件数量;
      •451 MI:SFQ 发信人在15分钟内的发信数量超过限制,请控制发信频率;
      •451 RP:QRC 发信方短期内累计的收件人数量超过限制,该发件人被临时禁止发信。请降低该用户发信频率;
      •451 Requested action aborted: local error in processing 系统暂时出现故障,请稍后再次尝试发送;
      •500 Error: bad syntaxU 发送的smtp命令语法有误;
      •550 MI:NHD HELO命令不允许为空;
      •550 MI:IMF 发信人电子邮件地址不合规范。请参考http://www.rfc-editor.org/关于电子邮件规范的定义;
      •550 MI:SPF 发信IP未被发送域的SPF许可。请参考http://www.openspf.org/关于SPF规范的定义;
      •550 MI:DMA 该邮件未被发信域的DMARC许可。请参考http://dmarc.org/关于DMARC规范的定义;
      •550 MI:STC 发件人当天的连接数量超出了限定数量,当天不再接受该发件人的邮件。请控制连接次数;
      •550 RP:FRL 网易邮箱不开放匿名转发(Open relay);
      •550 RP:RCL 群发收件人数量超过了限额,请减少每封邮件的收件人数量;
      •550 RP:TRC 发件人当天内累计的收件人数量超过限制,当天不再接受该发件人的邮件。请降低该用户发信频率;
      •550 DT:SPM 邮件正文带有很多垃圾邮件特征或发送环境缺乏规范性。需调整邮件内容或优化发送环境;
      •550 Invalid User 请求的用户不存在;
      •550 User in blacklist 该用户不被允许给网易用户发信;
      •550 User suspended 请求的用户处于禁用或者冻结状态;
      •550 Requested mail action not taken: too much recipient  群发数量超过了限额;
      •552 Illegal Attachment 不允许发送该类型的附件,包括以.uu .pif .scr .mim .hqx .bhx .cmd .vbs .bat .com .vbe .vb .js .wsh等结尾的附件;
      •552 Requested mail action aborted: exceeded mailsize limit 发送的信件大小超过了网易邮箱允许接收的最大限制;
      •553 Requested action not taken: NULL sender is not allowed 不允许发件人为空,请使用真实发件人发送;
      •553 Requested action not taken: Local user only  SMTP类型的机器只允许发信人是本站用户;
      •553 Requested action not taken: no smtp MX only  MX类型的机器不允许发信人是本站用户;
      •553 authentication is required  SMTP需要身份验证,请检查客户端设置;
      •****554** DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件;**
      •554 DT:SUM 信封发件人和信头发件人不匹配;
      •554 IP is rejected, smtp auth error limit exceed 该IP验证失败次数过多,被临时禁止连接。请检查验证信息设置;
      •554 HL:IHU 发信IP因发送垃圾邮件或存在异常的连接行为,被暂时挂起。请检测发信IP在历史上的发信情况和发信程序是否存在异常;
      •554 HL:IPB 该IP不在网易允许的发送地址列表里;
      •554 MI:STC 发件人当天内累计邮件数量超过限制,当天不再接受该发件人的投信。请降低发信频率;
      •554 MI:SPB 此用户不在网易允许的发信用户列表里;
      •554 IP in blacklist 该IP不在网易允许的发送地址列表里。

    https://blog.csdn.net/wangyanming123/article/details/52734334

    可能是同一时间发送次数过多,被拦截了,换个ip或者等一会再试。(用网易的企业邮箱会有这个问题,阿里云的没事)

    12参考链接:https://blog.csdn.net/angry_mills/article/details/102475632

    参考链接:

    Java实现邮件发送_baolingye的博客-CSDN博客_java发送邮件

    展开全文
  • dpp:DPP算法实现

    2021-03-21 13:54:31
    DPP多样性算法实现 文件说明 演示文件夹下面是Java版本的实现demo 其他文件夹下面是C ++版本和Python版本的实现演示 src文件夹下是一个SpringBoot工程,将DPP算法工程化,对外提供REST服务。 多样算法介绍 性能调优
  • java实现多态的方式

    千次阅读 2021-03-06 04:02:30
    Java实现多态的方式:1、接口实现;2、继承父类进行方法重写;3、同一个类中进行方法重载。多态存在的必要条件:1、要有继承;2、要有重写;3、父类引用指向子类对象。多态的好处:1、可替换(substitutability)...

    8d70b407230a2198e60078409930791e.png

    Java中实现多态的方式:

    1、接口实现;

    2、继承父类进行方法重写;

    3、同一个类中进行方法重载。

    多态存在的必要条件:

    1、要有继承;

    2、要有重写;

    3、父类引用指向子类对象。

    多态的好处:

    1、可替换性(substitutability)。

    多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。

    2、可扩充性(extensibility)。

    多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。

    3、接口性(interface-ability)。

    多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。

    4、灵活性(flexibility)。

    它在应用中体现了灵活多样的操作,提高了使用效率。

    5、简化性(simplicity)。

    多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

    多态实例:

    (1)相关类class A ...{

    public String show(D obj)...{

    return ("A and D");

    }

    public String show(A obj)...{

    return ("A and A");

    }

    }

    class B extends A...{

    public String show(B obj)...{

    return ("B and B");

    }

    public String show(A obj)...{

    return ("B and A");

    }

    }

    class C extends B...{}

    class D extends B...{}

    (2)问题:以下输出结果是什么?A a1 = new A();

    A a2 = new B();

    B b = new B();

    C c = new C();

    D d = new D();

    System.out.println(a1.show(b)); ①

    System.out.println(a1.show(c)); ②

    System.out.println(a1.show(d)); ③

    System.out.println(a2.show(b)); ④

    System.out.println(a2.show(c)); ⑤

    System.out.println(a2.show(d)); ⑥

    System.out.println(b.show(b)); ⑦

    System.out.println(b.show(c)); ⑧

    System.out.println(b.show(d)); ⑨

    (3)答案① A and A

    ② A and A

    ③ A and D

    ④ B and A

    ⑤ B and A

    ⑥ A and D

    ⑦ B and B

    ⑧ B and B

    ⑨ A and D

    展开全文
  • 什么是Java多态?如何实现Java多态?

    千次阅读 2021-06-29 10:54:20
    实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。 多态的作用:消除类型之间的耦合关系。 现实中,关于多态的例子不胜
  • RankSys-java

    2021-04-28 10:39:50
    RankSys:Java 8推荐系统框架,具有新颖性,多样... 该框架的公开版本(0.4.3)包括几种协作过滤推荐算法的实现,以及各种新颖性和多样性指标以及重新排序技术。 迄今为止发布的模块如下: RankSys核心:框架的通用和
  • 它们是生命周期、排他性和多样性。 分析结果通过一些饼图和折线图以及 analysis_result.txt 进行展示。 tomcat 程序已经过测试。 这些是什么 所有源代码都在 Eclipse 中组织,Eclipse 是 Java 的通用 IDE。 Report....
  • Liven是多样性管理程序。 它可以实现软件生命周期中的持续多样化。相数项目生命周期的描述。 选择转换点和转换。 一次探索转型。 组装多样性图。 创建多样化的变体。结构请参阅。
  • Java中用redisTemplate实现redis的scan命令

    千次阅读 2021-06-11 09:40:31
    业务场景 思路分析 代码实现 注意事项 思路拓展 参考资料
  • Java实现日志脱敏处理

    万次阅读 热门讨论 2019-01-24 19:30:36
    处理字段的方式多种多样,如何方便,高效才是关键,众所周知在java中最好的处理方式就是封装,即,对程序员暴露出的最好是一个统一的API,不关心具体的处理逻辑,能拿到想要的返回值就好。 实现第一版 由于在RP...
  • 其中教学教务管理系统就是一个明显的例子,教务系统很好的帮助学校减免了大量的工作,节省了大量的人力和财力,从而实现工作的高效。教学教务系统总共包含了三大块:管理员管理模块,教师模块,学生模块。这其中的...
  • java 实现mqtt发送和接收消息 客户端代码

    万次阅读 多人点赞 2019-01-23 14:18:58
    mqtt的特点就是可以用很少的网络和硬件资源来保证高并发量的数据...mqtt客户端可以由java、c语言等多种预言实现,我接下来就以java来示例。 1、mqtt客户端发送消息 mqtt发送消息首先要建立与服务器连接,接下来...
  • java实现第三届蓝桥杯DNA对比

    万次阅读 多人点赞 2019-07-29 20:26:03
    DNA对比 脱氧核糖核酸即常说的DNA,是一类带有遗传信息的生物大分子。它由4种主要的脱氧...DNA在转录复制的过程中可能会发生随机的偏差,这才最终造就了生物的多样性。 为了简化问题,我们假设,DNA在复制的时...
  • 10万字208道Java经典面试题总结(附答案)

    万次阅读 多人点赞 2021-08-01 16:05:55
    JDK(Java Development Kit),Java开发工具包 JRE(Java Runtime Environment),Java运行环境 JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。...
  • JAVA中implements实现多接口

    千次阅读 2019-09-11 10:59:28
    JAVA中implements实现多接口 这里有一个游戏,人猿泰山。 主角是一个单独的类,这里我们主要用怪物说明接口的用法: 怪物有很多种, 按地域分:有的在天上飞,有的在地上跑,有的在水里游 按攻击方式分:有的能近...
  • 这次采用java语言SSH框架(Spring,Struts,Hibernate)设计并实现了面向特定群体的健康管理平台。该网站主要有教师饮食管理、教师健康日志、教师体检管理、疾病预测评估等功能模块。通过该网站,教师可以更好的关注...
  • B树详细图解与Java完整实现

    万次阅读 多人点赞 2018-09-16 17:51:42
    本文的目的是从B树的起源讲起,再到多种语言的实现,以达到对B树有一个全面的认识,如果你是一个正常的程序员,那么看完就应该可以实现一个B-Tree了(如果你已经会了,那么也不会看完)。 B树的起源 在1970年,...
  • Java使用遗传算法实现智能组卷

    千次阅读 多人点赞 2021-02-26 17:56:20
    遗传算法实现智能组卷 0.需求 用户选择年级(非必传)、科目(非必传)、题目分类(知识点初版没有)、每个题型对应的题型数、难度系数,一键智能生成试卷,如下图,需要使用到遗传算法来实现出题规则 1.遗传算法: 1.0 ...
  • 基于Java的连连看游戏设计与实现 毕业设计(论文)要求及原始数据(资料): 1.简述Java游戏开发现状和走向; 2.了解图形用户界面的概念; 3.熟练掌握Java的事件处理机制; 4.掌握Java小程序的工作原理和使用...
  • 如何实现动态网页

    万次阅读 2018-08-31 08:11:15
    交互",即网页会根据用户的要求和选择而动态改变和响应,将浏览器作为客户端界面,这将是今后WEB发展的大势所趋. 2. "自动更新",即无须手动地更新HTML文档,便会自动生成新的页面,可以大大节省工作...
  • 这里写目录标题链表的概念及结构链表的实现实现链表的函数操作一、实现链表的打印函数二、实现得到单链表的长度函数三、查找是否包含关键字key是否在单链表当中三、链表头插法三、链表尾插法四、任意位置插入,第一...
  • Java实现高并发的处理的方式

    千次阅读 2017-08-11 23:38:46
    但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息...
  • 采购管理系统的分析与实现 摘 要 当今社会己进入信息社会时代,信息己经受到社会的广泛关注,被看作社会和科学技术发展的三大支柱(材料、能源、信息)之一。信息是管理的基础,是进行决策的基本依据。在一个组织里...
  • 欢迎添加微信互相交流学习哦! ... 摘 要 随着汽车工业的发展和汽车在现实生活中的普及,汽车租赁成为近年来兴起的一个新行业。为规范管理和经营行为,减少经营成本,提高...本系统使用MySQL数据库和Java语言实现了一
  • Java开源数据库引擎,数据库计算封闭的一站式解决方案。
  • mqtt客户端可以由java、c语言等多种预言实现,我接下来就以java来示例。 1、mqtt客户端发送消息 mqtt发送消息首先要建立与服务器连接,接下来指定主题topic、消息质量qos、消息体,然后通过发送消息方法将消息发送至...
  • 欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 目 录 摘 要 IV Abstract V 第1章 概述 1 1.1 课题背景 1 ...第2章 可行分析及总体设计原则 5 2.1可行分析 5...
  • Java实现面向对象编程

    万次阅读 多人点赞 2018-07-17 16:18:06
    目录 第1章... 10 抽象和封装......1.2通过创建对象实现领养宠物功能... 17 1.2.1创建类的对象... 17 1.2.2构造方法及其重载... 23 1.2.3常见错误... 28 1.3使用封装优化电子宠物系统的类... ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,388
精华内容 22,155
关键字:

java实现动态多样性