初步理解邮箱工作流
-
所需参数
-
hostName 配置好的邮箱服务器,发送和接收一般不是一个,各协议连接的服务器也不一定一样
-
port 需要连接的服务器对应协议开放的接口
各大邮箱的主机地址和端口在官网都可以查到,例如网易邮箱对应的协议服务器主机地址
-
mail 你在该网站注册或者学校分配的邮箱(这里隐藏了一个巨坑,你可能账号密码所有参数都是对的,但它就是javax.mail.AuthenticationFailedException: Logon failure: unknown user name or bad password ,怎么样都登不上去,这时你可以考虑把@后面的全部去掉,只留@之前的账号,特别是学校或者公司的账号)
-
password 如果大厂商的邮箱一般会把自己的客户端和外面客户端分开,这样会跟安全,会有额外的授权码登陆,你在Java mail用密码登是登不上去的
foxMail的客户端还是很好用的,只要你在它的客户端登上去了,你就可以看到所有需要的参数
-
-
接收
-
协议
-
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();
-
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服务器,你把邮件发送到的不是你填的收件人,而是你填的主机号的对应端口,等收件人拉取,如果是另外一家的就转发到它所在的主机对应的端口
-