学习Java发送邮件,必然会涉及到的一个术语就是SMTP,而且在邮箱中设置SMTP的时候我们还会看到另外两个术语:POP3和IMAP
简单的说,这三个都是邮件收发相关的三种协议。
- SMTP:全称是“Simple Mail Transfer Protocol”,简单邮件传输协议,它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。用于发送电子邮件的传输协议;
- POP3:全称是"Post Office Protocol 3",是邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。用于接收电子邮件的标准协议;
- IMAP:全称是"Internet Mail Access Protocol",即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作,是POP3的替代协议。
JavaMail是Oracle官方提供的一组API库,并没有包含在标准的JDK中,使用时需要我们自己导入架包
一般分为如下步骤
- 邮件服务器主机
- 传输协议SMTP
- 邮箱认证授权
- 发件人地址
- 收件人地址
- 收件人邮箱
- 邮件主题
- 邮件内容
1.创建邮件服务器主机
Properties props = new Properties();// 创建Properties对象,相当于SMTP服务器对象
props.put("mail.smtp.host", "smtp.163.com"); // SMTP主机名
props.put("mail.smtp.port", "25"); // 主机端口号
props.put("mail.smtp.auth", "true"); // 是否需要用户认证
props.put("mail.smtp.startls.enable", "true"); // 启用TLS加密
2.邮箱认证授权
// 参数1:服务器连接参数
// 参数2:账号和密码的授权认证对象
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
3.发送邮件
- 发送邮件时需要创建一个Message对象
- 需要设置发送方的地址
- 设置接受方的地址
- 设置邮件主题
- 设置邮件正文
- 最后发送
Message message=new Message(session);//发送邮件时需要创建一个Message对象
message.setFrom(new InternetAddress("18292285065@163.com")); // 发件方地址
message.setRecipient(RecipientType.TO, new InternetAddress("2273957338@qq.com"));// 收件方地址
message.setRecipients(RecipientType.CC, new InternetAddress[] { new InternetAddress("2232266959@qq.com"),
new InternetAddress("2232266959@qq.com") });// 群发(抄送)
message.setSubject("测试文件"); // 设置邮件标题
Transport.send(message);// 发送邮件
说明
- RecipientType.TO —> 单发,发送方为一个
- RecipientType.CC ----> 群发(抄送),发送方为多个
4.发送带正文和附件的邮件
- 设置正文部分
BodyPart textPart = new MimeBodyPart();
textPart.setContent("用<b>测试文件</b>", "text/html;charset=utf-8");
如果正文中带有html标签的字段,需要在设置正文内容时加上“text/html;charset=utf-8”,表示该文本是超文本格式,并使用utf-8进行编码
- 设置附件内容
BodyPart filePart = new MimeBodyPart();
filePart.setDataHandler(new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("E:\\APESOURCE\\评论页面\\img\\bj.jpg")), "application/octet-stream")));
注意:
添加附件时,不能直接使用message.setText() 方法,而是需要创建一个Multipart对象
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(filePart);
- 将组装完成的multipart对象放到message中
message.setContent(multipart);
- 完成这些操作后即可发送
Transport.send(message);
5发送内嵌图片的HTML文件
Multipart multipart = new MimeMultipart();
// 正文部分
BodyPart textPart = new MimeBodyPart();
StringBuffer contentPart = new StringBuffer();
contentPart.append("用<b>测试文件</b>");
contentPart.append("<img src=\"cid:pinglun\">");
textPart.setContent(contentPart.toString(), "text/html;charset=utf-8");
// 附件部分
BodyPart imagePart = new MimeBodyPart();
// 设置文件类型
imagePart.setDataHandler(new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("E:\\APESOURCE\\评论页面\\img\\bj.jpg")),
"application/octet-stream")));
// 设置当前图片为内嵌图片
imagePart.setHeader("Content-ID", "pinglun"); // 图片的内容ID