初步理解邮箱工作流

  • 所需参数
  1. hostName 配置好的邮箱服务器,发送和接收一般不是一个,各协议连接的服务器也不一定一样
  2. port 需要连接的服务器对应协议开放的接口
    各大邮箱的主机地址和端口在官网都可以查到,例如网易邮箱对应的协议服务器主机地址
  3. mail 你在该网站注册或者学校分配的邮箱(这里隐藏了一个巨坑,你可能账号密码所有参数都是对的,但它就是javax.mail.AuthenticationFailedException: Logon failure: unknown user name or bad password ,怎么样都登不上去,这时你可以考虑把@后面的全部去掉,只留@之前的账号,特别是学校或者公司的账号)
  4. password 如果大厂商的邮箱一般会把自己的客户端和外面客户端分开,这样会跟安全,会有额外的授权码登陆,你在Java mail用密码登是登不上去的

foxMail的客户端还是很好用的,只要你在它的客户端登上去了,你就可以看到所有需要的参数

JavaMailSender动态配置邮箱和密码 java account email_Java

  • 接收
  • 协议
  1. POP3协议
    Post Office Protocol 3,邮箱协议的第三个版本,POP邮局协议负责从邮件服务器中检索电子邮件。这个相当于只读,所做的删除移动等所有修改都是存在于客户端,而不是服务器,就是说如果你是用pop3协议登的,查看自己的有一个未读,点了之后变成已读了,不是服务器的标记变了,而是客户端的记住了,它下次拉取的时候过滤掉,服务器还是存在的,只要你退出账号或者换个客户端,这个邮件就又会被拉取
    Java用pop3接收邮件
//载入配置
         FileInputStream in = new FileInputStream(CONFIG_PATH);
         props.load(in);
         // 准备连接服务器的会话信息
         Properties prop = new Properties();
         // 协议
         prop.setProperty("mail.store.protocol", "pop3");
         // 端口
         prop.setProperty("mail.pop3.port", (String) props.get("getPort"));
         // pop3服务器
         prop.setProperty("mail.pop3.host", (String) props.get("getHostName"));
         prop.setProperty("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
         // 创建Session实例对象
         Session session = Session.getInstance(prop);
         Store store = session.getStore("pop3");
         logger.debug("store connecting");
         store.connect((String) props.get("mail"), (String) props.get("password"));
         // 获得收件箱
         Folder folder = store.getFolder("INBOX");
         /* Folder.READ_ONLY:只读权限
          * Folder.READ_WRITE:可读可写(可以修改邮件的状态)
          */
         //打开收件箱
         folder.open(Folder.READ_WRITE);
 				// 得到收件箱中的所有邮件
 	      Message[] messages = folder.getMessages();
  1. IMAP协议
    Internet Message Access Protocol,是通过Internet获取信息的一种协议,IMAP4改进了POP3的不 足,用户可以通过浏览信件头来决定是否收取、删除和检索邮件的特定部分,还可以在服务器上创建或更改文件夹或邮箱,感觉IMAP是一种优于POP3的协议,它和邮箱的连接是交互的,进行的操作是可以反应到服务器的,同时也可以根据根据服务器的邮件头判断邮件是否以读
    Java用imap接收邮件
// 准备连接服务器的会话信息
 		Properties props = new Properties();
 		props.setProperty("mail.store.protocol", "imap");
 		props.setProperty("mail.imap.host", "imap.163.com");
 		props.setProperty("mail.imap.port", "143");
 		
 		// 创建Session实例对象
 		Session session = Session.getInstance(props);
 		
 		// 创建IMAP协议的Store对象
 		Store store = session.getStore("imap");
 		
 		// 连接邮件服务器
 		store.connect("xyang0917@163.com", "123456abc");
 		
 		// 获得收件箱
 		Folder folder = store.getFolder("INBOX");
 		// 以读写模式打开收件箱
 		folder.open(Folder.READ_WRITE);
 		
 		// 获得收件箱的邮件列表
 		Message[] messages = folder.getMessages();
  • 工作流
    当于你去hostName这个网站登陆账号,查看是否有自己的邮件可以拉取,你收到的邮箱都是别人发送到服务器的,你不在线或者不拉取都会在,发件人和你之间存在一个邮箱服务器
  • 发送
  • 协议
    SMTP
    Simple Mail Transfer Protocol,简单邮件传输协议,SMTP 协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。是一种发送协议。
    Java 用smtp发邮件
FileInputStream in = new FileInputStream(CONFIG_PATH);
          props.load(in);
          try {
              // 创建一个HtmlEmail实例对象
              HtmlEmail email = new HtmlEmail();
              // 邮箱的SMTP服务器,一般123邮箱的是smtp.123.com,qq邮箱为smtp.qq.com
              email.setHostName((String) props.get("sendHostName"));
              // 设置发送的字符类型
              email.setCharset((String) props.get("character"));
              //设置ssl链接
              email.setSSLOnConnect(false);
              email.setSslSmtpPort((String) props.get("port"));
  
              // 设置收件人
              email.addTo(toMail);
              //添加附件
              if (filePath!=null) {
                  email.attach(new File(filePath));
              }
              // 发送人的邮箱为自己的,用户名可以随便填
              email.setFrom((String) props.get("mail"),(String) props.get("sendName"));
              // 设置发送人到的邮箱和用户名和授权码(授权码是自己设置的)
              logger.debug((String) props.get("mail")+"----"+(String) props.get("password"));
              email.setAuthentication((String) props.get("mail"),(String) props.get("password"));
              // 设置发送主题email.setMsg("1234");//设置发送内容email.send();//进行发送
              email.setSubject(subject);
              email.setHtmlMsg(msg);
              email.send();
              logger.debug("发送成功");
              return true;
          } catch (Exception e) {
              logger.debug("发送失败");
              e.printStackTrace();
              return false;
          }
  • 工作流
    发送就是用你这个账号密码去登别人配置好的mail服务器,你把邮件发送到的不是你填的收件人,而是你填的主机号的对应端口,等收件人拉取,如果是另外一家的就转发到它所在的主机对应的端口