初步理解邮箱工作流
- 所需参数
- 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服务器,你把邮件发送到的不是你填的收件人,而是你填的主机号的对应端口,等收件人拉取,如果是另外一家的就转发到它所在的主机对应的端口