赞
踩
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表示该收件人为抄送人。
执行代码得到:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。