什么是JavaEail?
JavaEmail是一个用于发送和接收电子邮件的Java API。它可以帮助我们方便地在Java应用程序中实现电子邮件功能,例如发送包含文本或附件的电子邮件、接收电子邮件等,那么它是如何实现的呢?
一、使用JavaEmail的准备工作
- 由于JDK核心类库里没有给我们提供相应的类,所有我们需要去官网下载一个JavaMail相关的依赖包(javax.mail-1.6.2.jar);
- 准备SMTP登录信息:
在JavaEmail发送邮件的过程中,必须要遵守的一个协议就是SMTP协议,SMTP协议是一个建立在TCP之上的协议,任何程序发送邮件都必须遵守SMTP协议。
以网易邮箱举例,打开POP3/SMTP服务,
获取授权密码:
- 创建Seesion会话对象:
Seesion会话对象提供了与邮件服务器进行通信所需的配置信息,例如SMTP服务器地址、端口号、用户名和密码等。由于每次发送JavaEmail都会用到Session会话对象,所以我们可以将Session对象的创建封装成一个静态方法,从而方便代码的使用以及代码的整洁。
public class JavaMailUtils {
private JavaMailUtils() {}
public static Session creatSession() {
// 设置账号信息
String userName = "dadadadaxigua0707@163.com";// 邮箱发送账号
String passWord = "MCJQLIBOEMXSQKCK";// 账号授权密码
// SMTP服务器链接信息
Properties props = new Properties();
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.starttls.enable", "true");// 启用TLS加密
// 创建session会话对象
// 参数1:smtp服务器链接对象
// 参数2:账号和密码的授权认证对象
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, passWord);
}
});
session.setDebug(true);//debug调试模式
return session;
}
}
常用邮件服务商的SMTP信息:
1.qq邮箱:SMTP服务器是 smtp.qq.com,端口是465 / 857
2.163邮箱:SMTP服务器是smtp.163.com,端口465
3.Gmail邮箱:SMTP服务器是smtp.gmil.com,端口是465 / 587
二、案例实现
1.发送文本邮件
public static void main(String[] args) {
try {
//1.创建会话对象
Session session = JavaMailUtils.creatSession();
//2.创建邮件对象
MimeMessage message = new MimeMessage(session);
message.setSubject("晴天");//设置邮件标题
message.setText("但偏偏,雨渐渐,等不到你的一眼");//设置邮件正文
message.setFrom(new InternetAddress("dadadadaxigua0707@163.com"));//发件人信息
message.setRecipient(RecipientType.TO, new InternetAddress("1710311450@qq.com"));//收件人信息
//3.发送
for(int i =0;i<20;i++) {
Transport.send(message);
System.out.println("发送成功!");
}
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2.发送含有附件的邮件(附加抄送)
要在电子邮件中携带附件,我们就不能直接调用message.setText()方法,而是要构造一个Multipart对象:
public static void main(String[] args) throws IOException {
try {
Session session = JavaMailUtils.creatSession();//创建会话对象
MimeMessage message = new MimeMessage(session);创建邮件对象
message.setFrom(new InternetAddress("dadadadaxigua0707@163.com"));//发件人
// RecipientType.CC是抄送发送,即一次可以将邮件发送给多人
message.setRecipients(RecipientType.CC, new InternetAddress[] {
new InternetAddress("2633550265@qq.com"),
new InternetAddress("1710311450@qq.com"),
new InternetAddress("2499460204@qq.com")
});//收件人
message.setSubject("GGBONDE!"); //邮件标题
//正文+附件组装成附件对象
Multipart multipart = new MimeMultipart();
//正文
BodyPart textPart = new MimeBodyPart();
textPart.setContent("他不是死猪,他是GGBOND!","text/html;charset=utf-8");
//将设置好的正文加入邮件对象中
multipart.addBodyPart(textPart);
//附件
BodyPart filePart = new MimeBodyPart();
filePart.setFileName("GGBody.jpg");//设置发送的文件名
filePart.setDataHandler(new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("d:\\test\\bbb\\GG-Bond.jpg")),
"application/octet-stream")));
multipart.addBodyPart(filePart);
//将附件对象放入邮件中
message.setContent(multipart);
//发送
Transport.send(message);
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
3.发送内嵌图片的HTML邮件
将内嵌图片作为一个附件嵌入邮件,即邮件本身也是Multipart,但需要做一点额外的处理:
public static void main(String[] args) {
try {
Session session = JavaMailUtils.creatSession();
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("dadadadaxigua0707@163.com"));
message.setRecipients(RecipientType.CC, new InternetAddress[] {
new InternetAddress("2633550265@qq.com"),
new InternetAddress("1710311450@qq.com"),
new InternetAddress("2499460204@qq.com")
});
message.setSubject("GGBONDE!");
//正文
BodyPart textPart = new MimeBodyPart();
StringBuilder contentText = new StringBuilder();
contentText.append("<h3>GGBond</h3>");
contentText.append("<p>他不是死猪,他是GGBOND!</p>");
contentText.append("<img src=\"cid:ggb\"/>");
textPart.setContent(contentText.toString(),"text/html;charset=utf-8");
//附件
BodyPart imagePart = new MimeBodyPart();
imagePart.setDataHandler(new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("d:\\test\\bbb\\GG-Bond.jpg")),
"application/octet-stream")));
//设置当前image为内嵌图片
imagePart.addHeader("Content-ID","ggb");
//正文+附件组装成附件对象
Multipart multipart = new MimeMultipart();
//将设置好的团片加入邮件对象中
multipart.addBodyPart(imagePart);
//将设置好的正文加入邮件对象中
multipart.addBodyPart(textPart);
//将附件对象放入邮件中
message.setContent(multipart);
//发送
Transport.send(message);
}
...
}