一、准备SMTP登录信息
要使用JavaMail发送邮件,首先需要准备SMTP登录信息。
常用邮件服务商的SMTP信息:
QQ邮箱:SMTP服务器是smtp.qq.com,端口是465/587
163邮箱:SMTP服务器是smtp.163.com,端口是465
Gmail邮箱:SMTP服务器是smtp.gmail.com,端口是465/587
126邮箱:SMTP服务器是smtp,126.com,端口号是25
以126邮箱为例进行邮件的发送:
准备好SMTP登录信息后,把JavaMail相关的依赖jar包导入:javax.mail-162.jar
二、JavaMailUtils工具类
创建一个工具类,该工具类中有一个静态的createSession()方法,此方法用于封装邮箱账号信息,SMTP服务器连接信息,创建Session会话。在后续编写代码发送各种邮件时,不需要重复创建邮箱账号信息等内容,直接调用该工具类中的createSession()方法即可,避免了代码冗余。
//工具类
public final class JavaMailUtils {
private JavaMailUtils() {}
public static Session createSession() {
//邮箱账号信息
String username="y183296@126.com"; //邮箱发送账号
String password="NYDGQMMPDAEIGKVQ";//账号授权密码
//SMTP服务器连接信息
Properties props=new Properties();
props.put("mail.smtp.host","smtp.126.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);
}
});
//设置debug模式便于调试
session.setDebug(true);
return session;
}
}
三、发送邮件
首先调用工具类的createSession()方法创建session会话,然后创建邮件对象,设置邮件标题、内容、以及发送方和接收方的账号,最后通过Transport.send(message);完成发送。
public class Demo02 {
public static void main(String[] args) {
try{
//1.创建session会话
Session session=JavaMailUtils.createSession();
//2.创建邮件对象
MimeMessage message=new MimeMessage(session);
message.setSubject("测试邮件");//设置邮件标题
message.setText("这是一封测试邮件!");//设置内容
message.setFrom(new InternetAddress("y183296@126.com"));
message.setRecipient(RecipientType.TO, new InternetAddress("1299542670@qq.com"));
//3.发送
Transport.send(message);
} catch (AddressException e) {
e.printStackTrace();
}catch(MessagingException e) {
e.printStackTrace();
}
}
}
四、发送包含HTML标签的邮件
此案例在发送邮件的基础上进行了改动,此案例不仅对一个账号进行了邮件发送,还抄送给了其他两个邮箱。RecipientType.CC设置接收类型为抄送,抄送给的接收方,可以是多人,需要用一个数组来存储InternetAddress[]。邮件正文使用了html标签,message.setText("你被<b>太阳</b>照耀的时候!","utf-8","html"); "utf-8"和"html"可以让带有html标签的字符串能够按html样式正常显示,该案例中"太阳"二字被加粗。
public class Demo03 {
public static void main(String[] args) {
try {
Session session=JavaMailUtils.createSession();
MimeMessage message=new MimeMessage(session);
message.setFrom(new InternetAddress("y183296@126.com"));
message.setRecipient(RecipientType.TO, new InternetAddress("1299542670@qq.com"));
message.setRecipients(RecipientType.CC, new InternetAddress[] {new InternetAddress("1423161910@qq.com"),new InternetAddress("2919817636@qq.com")});
message.setSubject("测试邮件");
//邮件正文包含html标签
message.setText("你被<b>太阳</b>照耀的时候!","utf-8","html");
Transport.send(message);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
五、发送带有附件的邮件
此案例发送的邮件既包含正文又包含附件,通过BodyPart设置正文和附件,第一个BodyPart是正文,使用setContent()方法设置内容,设置纯文本内容使用textPart.setContent("太阳照耀的时候!","text/plain;charset=utf-8");,设置html文本内容使用textPart.setContent("你被<b>太阳</b>照耀的时候!","text/html;charset=utf-8");。第二个BodyPart是附件,需要设置文件名,并且添加 一个DataHandler(),传入文件的MIME类型。然后构造一个Multipart对象,将正文+附件组装成Multipart对象。最后通过setContent()将Multipart对象放入邮件,即可发送。
public class Demo04 {
public static void main(String[] args) {
try {
Session session=JavaMailUtils.createSession();
MimeMessage message=new MimeMessage(session);
message.setFrom(new InternetAddress("y183296@126.com"));
message.setRecipient(RecipientType.TO, new InternetAddress("1299542670@qq.com"));
message.setRecipients(RecipientType.CC, new InternetAddress[] {new InternetAddress("1423161910@qq.com"),new InternetAddress("2919817636@qq.com")});
message.setSubject("测试邮件");
//邮件中既包含正文,又包含附件
//正文
BodyPart textPart=new MimeBodyPart();
textPart.setContent("你被<b>太阳</b>照耀的时候!","text/html;charset=utf-8");
//附件
BodyPart filePart=new MimeBodyPart();
filePart.setFileName("图片");
//上传附件文件
filePart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("D:\\test\\20230706\\bg.jpg")),"application/octet-stream")));
//将正文+附件组装成Multipart对象
Multipart multipart=new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(filePart);
//将Multipart对象放入邮件
message.setContent(multipart);
Transport.send(message);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
六、发送内嵌图片的HTML邮件
imagePart.addHeader("Content-ID", "mao");设置了图片的内容ID。contentText.append("<img src=\"cid:mao\"/>");中的cid对应的是图片的内容ID。
public class Demo05 {
public static void main(String[] args) {
try {
Session session=JavaMailUtils.createSession();
MimeMessage message=new MimeMessage(session);
message.setFrom(new InternetAddress("y183296@126.com"));
message.setRecipient(RecipientType.TO, new InternetAddress("1299542670@qq.com"));
message.setRecipients(RecipientType.CC, new InternetAddress[] {new InternetAddress("1423161910@qq.com"),new InternetAddress("2919817636@qq.com")});
message.setSubject("测试邮件mao");
//邮件正文包含html标签
BodyPart textPart=new MimeBodyPart();
StringBuilder contentText=new StringBuilder();
contentText.append("<h3>小猫</h3>");
contentText.append("<p>一张小猫图片!</p>");
contentText.append("<img src=\"cid:mao\"/>");
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\\20230706\\bg.jpg")),
"application/octet-stream")));
imagePart.addHeader("Content-ID", "mao");//图片的内容ID
//将正文+附件组装成Multipart对象
Multipart multipart=new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(imagePart);
//将Multipart对象放入邮件
message.setContent(multipart);
//发送邮件
Transport.send(message);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}