抛开电子邮件不谈,日常生活中我们想要发送信件,邮件的时候需要经历这些步骤:
首先,我们的家门口都有一个信箱,我们将贴好邮票的信件放入信箱,这时候邮局看到邮箱中的信件之后,盖上出发的印章发往目的地的邮局,目的地的邮局收到信件之后,再盖上一个到达的印章发往目的地的信箱里面。
通过上面所说的,我们就可以将电子邮件的发送过程联想出来,电子邮件是通过用户电脑上的邮件软件发送到邮件服务器上,中途可能经过多个邮件服务器的中转,最终到达收件方的邮件软件用于接收。
发送邮件前的准备:
准备jar包
javax.mail-1.6.2.jar
准备SMTP登录信息:
常用邮件服务商的SMTP信息:
qq邮箱:SMTP服务器是:smtp.qq.com、端口是465/587
163邮箱:SMTP服务器是:smtp.163.com、端口是465
126邮箱:SMTP服务器是:smtp.126.com、端口是465/994
这些准备信息我封装到了一个JavaMailUtils类中(userName是网易邮箱账号):
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
//工具类
public final class JavaMailUtils {
private JavaMailUtils() {
}
public static Session createSession() {
//邮箱账号信息
String userName = "m13152448308_1@163.com";
String password = "OBSHGUTWPOLKRGVZ";
//SMTP服务器连接信息
Properties props = new Properties();
props.put("mail.smtp.host","smtp.163.com"); //SMTP主机名
props.put("mail.smtp.prot","465"); //主机端口号
props.put("mail.smtp.auth","true"); //是否需要用户认证
props.put("mail.smtp.starttls.enable","true"); //启用TLS加密
Session session = Session.getInstance(props,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
session.setDebug(true);
return session;
}
}
将准备信息以键值对的方式存入props对象里,在下面创建一个session会话对象,调用getInstance方法将准备信息和用户名密码传进去,注意Authenticator在这里是一个匿名子类的存在,需要重写抽象类中的抽象方法。
做好了以上的准备工作,我们重新创建一个类,用于发送和接受邮件。
public class Demo02 {
public static void main(String[] args) {
try {
//1.创建Session会话
Session session = JavaMailUtils.createSession();
//2.创建邮件对象
MimeMessage message = new MimeMessage(session);
message.setSubject("学习JavaMail"); //设置邮件标题
message.setText("从入门到<b>放弃</b>","utf-8","html"); //设置邮件正文
message.setFrom(new InternetAddress("1315***1@163.com")); // 发件人
message.setRecipient(RecipientType.TO, new InternetAddress("1252303367@qq.com")); //收件人
//发送邮件
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这样我们就完成了简单的邮件发送。(注意:邮件正文中可以包含html标签)
在上面的基础上我们知道RecipientType.TO是给主要收件人发送邮件,我们除此之外还可以通过RecipientType.CC抄送多个收件人。
抄送:
public class Demo02 {
public static void main(String[] args) {
try {
//创建Session会话
Session session = JavaMailUtils.createSession();
//创建邮件对象
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("m13152448308_1@163.com")); // 发件人
message.setRecipient(RecipientType.TO, new InternetAddress("1252303367@qq.com")); //收件人
message.setRecipients(RecipientType.CC, new InternetAddress[] {new InternetAddress("2436120035@qq.com") , new InternetAddress("1252303367@qq.com")}); // 抄送
message.setSubject("学习JavaMail");
//正文
BodyPart textpart = new MimeBodyPart();
StringBuilder contain = new StringBuilder();
contain.append("<h3>刀剑神域</h3>");
contain.append("<p>非常好看</p>");
contain.append("<img src=\"cid:lmy\"/>");
textpart.setContent(contain.toString(),"text/html;charset=utf-8");
// 附件
BodyPart filepart = new MimeBodyPart();
filepart.setFileName("曹桑");
//上传附件文件
filepart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(
Paths.get("C:\\Users\\lenovo\\Desktop\\cbx\\douban\\cao\\1.jpg")),"application/octet-stream")));
filepart.setHeader("Content-ID", "lmy");
// 将正文+附件组装成multipart对象
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textpart);
multipart.addBodyPart(filepart);
//将multipart对象放入邮箱
message.setContent(multipart);
//发送邮件
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}