1.概述:SMTP协议为邮件发送协议,在java应用程序中,可以使用SMTP协议实现发送邮件的功能。
2.创建Session会话
在使用SMTP协议之前,需要导入扩展包javax.mail。
下载地址:https://mvnrepository.com/artifact/com.sun.mail/javax.mail
还要在自己邮箱的设置页面开启SMTP服务和获取授权码
注意:授权密码只出现一次,获取后保存下来。
public static void main(String[] args) {
//封装服务器连接信息
Properties pros=new Properties();
pros.put("mail.smtp.host", "smtp.163.com");
pros.put("mail.smtp.port", "25");
pros.put("mail.smtp.auth", "true");
pros.put("mail.smtp.starttls.enable","true" );
//创建Session会话
//参数一:服务器连接信息
//参数二:账号密码校验对象(用户认证对象)
Session session=Session.getInstance(pros, new Authenticator() {
String userName="邮箱账号";
String password="授权码";
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
System.out.println(session);
}
在上面的代码中,我们将与服务器连接的信息封装在Properties对象中,在创建Session对象时,需要传入两个参数 ,第一个参数就是我们封装的服务器连接信息,第二个参数为用户认证对象,因为Authenticator为抽象类,所以创建一个匿名子类对象并将邮箱账号和授权码传入。
运行结果:
如果我们可以正常的输出Session对象,则我们与服务器连接成功。为了以后开发方便,我们将创建Session对象的过程封装到成一个工具类的静态方法,如下图所示:
public final class JavaMailUtils {
private JavaMailUtils() {
}
public static Session createSession() {
Properties pros=new Properties();
pros.put("mail.smtp.host", "smtp.163.com");
pros.put("mail.smtp.port", "25");
pros.put("mail.smtp.auth", "true");
pros.put("mail.smtp.starttls.enable","true" );
//创建Session
Session session=Session.getInstance(pros, new Authenticator() {
String userName="邮箱账号";
String password="授权码";
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
session.setDebug(true);
return session;
}
}
3.发送普通文本邮件
与服务器连接成功后,接下来就需要写邮件了,java中一封邮件就是一个MimeMessage对象 ,通过MimeMessage对象设置收件人,发件人,主题以及邮件内容等等。最后使用Transport.send()方法发送邮件。
public static void main(String[] args) {
//1.创建Session
try {
Session session=JavaMailUtils.createSession();
System.out.println(session);
//2.创建邮件对象
MimeMessage message=new MimeMessage(session);
//设置邮件主题
message.setSubject("这是一个测试邮件");
//设置邮件内容
message.setText("测试邮件");
//设置发件人
message.setFrom(new InternetAddress("邮箱账号"));
//设置收件人
message.setRecipient(RecipientType.TO, new InternetAddress("邮件账号"));
//3.发送邮件
Transport.send(message);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
执行上述代码后,就可以在收件人的邮箱中收到邮件。
邮箱内容:
4.发送带有附件的邮件
在生活中,我们经常会发送带有附件的邮件,接下来,我们就通过java程序发送带有附件的邮件,要发送带有附件的邮件,不能直接设置正文内容,需要用到BodyPart的子类对象分别设置正文和附件的内容,然后整合后一起添加到MimeMessage对象中。
public static void main(String[] args) {
try {
//1.创建Session会话
Session session=JavaMailUtils.createSession();
//2.创建邮件对象
MimeMessage message=new MimeMessage(session);
message.setSubject("这是一个带有附件的测试邮件");
message.setFrom(new InternetAddress("发件人邮箱账号"));
message.setRecipient(RecipientType.TO,new InternetAddress("收件人邮箱账号") );
//设置正文
BodyPart textPart=new MimeBodyPart();
//设置正文内容并标明含有html标签
textPart.setContent("带有<b>附件</b>的邮件", "text/html;charset=utf-8");
//设置附件
BodyPart filePart=new MimeBodyPart();
filePart.setFileName("四级成绩.jpg");
filePart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("附件文件路径")), "application/octet-stream")));
//整合正文和附件
Multipart part=new MimeMultipart();
part.addBodyPart(textPart);
part.addBodyPart(filePart);
//添加正文和邮件
message.setContent(part);
//3.发送邮件
Transport.send(message);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
上面的代码中,在设置正文内容的时候还标明了含有html标签,这样我们就可以在内容中使用html标签了。
执行上述代码得到:
5.发送在正文嵌套图片的邮件
我们有时候需要在邮件的正文中嵌套图片,那么这个功能在java程序中如何实现呢?
在发送带有附件的邮件时,我们将邮件分为了两个BodyPart对象,整合后直接添加到MimeMessage中,在正文嵌套图片中,也是将正文和图片创建为两个BodyPart对象,只不过这次需要在正文里通过img标签引用图片。
//1.创建Session会话
Session session=JavaMailUtils.createSession();
//2.创建邮件对象
MimeMessage message=new MimeMessage(session);
message.setSubject("这是一个正文嵌套图片的测试邮件");
message.setFrom(new InternetAddress("发件人邮箱账号"));
message.setRecipient(RecipientType.TO,new InternetAddress("主收件人邮箱账号") );
message.setRecipients(RecipientType.CC, new InternetAddress[] {new InternetAddress("抄送人邮箱账号1"),
new InternetAddress("抄送人邮箱账号2")});
//设置正文
BodyPart textPart=new MimeBodyPart();
StringBuilder text=new StringBuilder();
text.append("<h1>测试邮件</h1>");
//cid:zjb表示引用编号为zjb的BodyPart对象
text.append("<img src=\"cid:zjb\"/>");
textPart.setContent(text.toString(), "text/html;charset=utf-8");
//设置图片
BodyPart imagePart=new MimeBodyPart();
imagePart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("图片路径")),
"application/octet-stream")));
//设置图片编号,便于设置正文时引用
imagePart.setHeader("Content-ID", "zjb");
Multipart part=new MimeMultipart();
part.addBodyPart(textPart);
part.addBodyPart(imagePart);
message.setContent(part);
//3.发送邮件
Transport.send(message);
我们除了设置一个主收件人,还可以设置多个抄送人,因为抄送人可以设置多个(可以实现群发),所以设置抄送人的时候为一个InternetAddress类型数组,RecipientType.TO表示该收件人为主收件人,RecipientType.CC表示该收件人为抄送人。
执行代码得到: