一、POP3、SMTP和IMAP了解
1.1 什么是POP3
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。(与IMAP有什么区别?)
1.2 什么是SMTP
SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。
增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。
1.3 什么是IMAP
IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。(与POP3有什么区别?)
二、网易163免费邮箱相关服务器信息
2.1 163免费邮客户端设置的POP3、SMTP、IMAP地址
2.2 163邮箱配置
网易邮箱已经默认开启 POP3/SMTP/IMAP 服务,方便您可以通过电脑客户端软件更好地收发邮件。
如果关闭可以通过以下方式开启:
- 请登录163邮箱,
- 点击页面正上方的“设置”,
- 再点击左侧上“POP3/SMTP/IMAP”,
- 其中“开启SMTP服务”是系统默认勾选开启的。
您可勾选图中另两个选项,点击确定,即可开启成功。不勾选图中两个选项,点击确定,可关闭成功。
以下开始编写代码。
三、163发送邮箱实现
3.1开发环境
JavaMail 版本: 1.6.0 JDK 版本: JDK 1.8 IDEA 本测试基于163邮箱
3.2 引入邮件需要的依赖
<!-- mail --> <dependency > <groupId >javax.mail </groupId > <artifactId >mail </artifactId > <version >1.4.5 </version > </dependency > <dependency > <groupId >com.sun.mail </groupId > <artifactId >javax.mail </artifactId > <version >1.5.4 </version > </dependency >
3.3编写EmailUtils
package pro.demo.SpringBootdemo.util; import java.util.Date; import java.util.Properties; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; /* * 本测试基于163邮箱 */ public class EmailUtil { //发件人邮箱 (开通 POP3/SMTP/IMAP服务的邮箱) private static final String myEmailAccount = "******@163.com"; //POP3/SMTP/IMAP客户端授权密码或者邮箱密码 private static final String myEmailPassword = "******"; /** * 一对一发送邮件 * * @param fromName 发件人姓名 * @param receiveMailAccount 收件人邮箱 * @param title 邮件标题 * @param content 邮件内容 * * @return true 成功 false 失败 * */ public static boolean sendEmail(String fromName, String receiveMailAccount, String title, String content){ // 1. 创建参数配置, 用于连接邮件服务器的参数配置 Properties props = new Properties(); // 参数配置 props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求) props.setProperty("mail.smtp.host", "smtp.163.com"); // 发件人的邮箱的 SMTP 服务器地址, 163邮箱固定为:smtp.163.com props.setProperty("mail.smtp.auth", "true"); // 需要请求认证 props.setProperty("mail.smtp.port", "25"); // 邮箱服务器端口号 163邮箱SMTP默认是25 try { // 2. 根据配置创建会话对象, 用于和邮件服务器交互 Session session = Session.getInstance(props); session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log // 3. 创建一封邮件 MimeMessage message = new MimeMessage(session); // 3.1 From: 发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称) message.setFrom(new InternetAddress(myEmailAccount, fromName, "UTF-8")); // 3.2 To: 收件人(可以增加多个收件人、抄送、密送) message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMailAccount, "", "UTF-8")); // 3.3 Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题) message.setSubject(title, "UTF-8"); // 3.4 Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容) message.setContent(content, "text/html;charset=UTF-8"); // 3.5 设置发件时间 message.setSentDate(new Date()); // 3.6. 保存设置 message.saveChanges(); // 4. 根据 Session 获取邮件传输对象 Transport transport = session.getTransport(); //5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错 transport.connect(myEmailAccount, myEmailPassword); // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人 transport.sendMessage(message, message.getAllRecipients()); // 7. 关闭连接 transport.close(); return true; } catch (Exception e) { return false; } }
3.4调试发邮件
/** * 调试发邮件功能 * */ public static void main(String[] args) { boolean bl = sendEmail("测试员", "********@qq.com", "测试数据", "你好,这是一封测试邮件,请忽略"); if(bl){ System.out.println("success"); //邮件发送成功 }else{ System.out.println("failed"); //邮件发送失败 } }
3.5 接收到测试邮件
如下图,是接收到的测试邮件截图。好了,一个基于163邮箱的发送功能完成了。