Java-mail实现简单邮件发送(非SpringBoot)
一、实现原理
邮件服务器是电子邮件系统的基础设施,因特网上所有的服务提供商都有自己的邮件服务器。
发送邮件时,发送方通过用户代理(SMTP)将自己的邮件传送到自己邮箱对应的服务器中,同时发送方服务器发送邮件给接收方邮件服务器(SMTP);收件人在自己方便的时候通过用户代理从自己的邮件服务器中拉取邮件(POP3[110端口]、IMAP4[143端口])
二、操作步骤
导入依赖
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency>
编写简单邮件代码(只包含文字信息)

1 package com.kuang; 2 3 //发一封简单的邮件 4 5 import com.sun.mail.util.MailSSLSocketFactory; 6 7 import javax.mail.*; 8 import javax.mail.internet.InternetAddress; 9 import javax.mail.internet.MimeMessage; 10 import java.util.Properties; 11 12 public class MailDemo01 { 13 public static void main(String[] args) throws Exception{ 14 Properties properties = new Properties(); 15 properties.setProperty("mail.host","smtp.qq.com");//设置QQ邮件服务器 16 properties.setProperty("mail.transport.protocol","smtp");//邮件发送协议 17 properties.setProperty("mail.smtp.auth","true");//需要验证用户名密码 18 19 // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可 钉钉邮箱也需要 大厂特色 20 MailSSLSocketFactory sf = new MailSSLSocketFactory(); 21 sf.setTrustAllHosts(true); 22 properties.put("mail.smtp.ssl.enable","true"); 23 properties.put("mail.smtp.ssl.socketFactory",sf); 24 25 // 使用JavaMail发送邮件的5个步骤 26 27 // 1. 创建定义整个应用程序所需要的环境信息的Session对象 28 // 创建定义整个应用程序所需要的环境信息Session对象 29 30 // qq才有 31 Session session=Session.getDefaultInstance(properties, new Authenticator() { 32 @Override 33 protected PasswordAuthentication getPasswordAuthentication() { 34 // 发件人邮件用户名、授权码 35 return new PasswordAuthentication("21652684801@qq.com","QQ邮件授权码(需要自己进行获取替换)"); 36 } 37 }); 38 39 40 // 开启session的debug模式,可以查看到程序发送的Email的情况 41 session.setDebug(true); 42 43 // 2. 通过session得到transport对象 44 Transport ts=session.getTransport(); 45 46 // 3.使用邮箱的用户名和授权码连上邮件服务器 47 ts.connect("smtp.qq.com","21652684801@qq.com","QQ邮件的授权码(需要自己获取替换)"); 48 // 4.创建邮件:写邮件 49 // 注意需要传递session 50 51 // 注意需要传递session 52 MimeMessage message=new MimeMessage(session); 53 54 // 指明邮件的发件人 55 message.setFrom(new InternetAddress("同上")); 56 57 // 指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发 58 message.setRecipient(Message.RecipientType.TO,new InternetAddress("同上@qq.com")); 59 60 // 邮件的标题 61 message.setSubject("仅仅包含简单文字信息的邮件内容"); 62 63 // 邮件文本的内容 64 message.setContent("<h1 style='color:red'>泥嚎!世界<h1>","text/html;charset=utf-8"); 65 66 // 5.发送邮件 67 ts.sendMessage(message,message.getAllRecipients()); 68 69 // 6. 关闭连接 70 ts.close(); 71 72 } 73 }
编写复杂邮件的信息(包含图片、包含附件)
超文本内容设置为alternative , 内嵌资源为related,附件为mixed
代码编写

1 package com.kuang; 2 3 //发一封简单的邮件 4 5 import com.sun.mail.util.MailSSLSocketFactory; 6 7 import javax.activation.DataHandler; 8 import javax.activation.FileDataSource; 9 import javax.mail.*; 10 import javax.mail.internet.InternetAddress; 11 import javax.mail.internet.MimeBodyPart; 12 import javax.mail.internet.MimeMessage; 13 import javax.mail.internet.MimeMultipart; 14 import java.util.Properties; 15 16 public class MailDemo01 { 17 public static void main(String[] args) throws Exception{ 18 Properties properties = new Properties(); 19 properties.setProperty("mail.host","smtp.qq.com");//设置QQ邮件服务器 20 properties.setProperty("mail.transport.protocol","smtp");//邮件发送协议 21 properties.setProperty("mail.smtp.auth","true");//需要验证用户名密码 22 23 // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可 钉钉邮箱也需要 大厂 24 MailSSLSocketFactory sf = new MailSSLSocketFactory(); 25 sf.setTrustAllHosts(true); 26 properties.put("mail.smtp.ssl.enable","true"); 27 properties.put("mail.smtp.ssl.socketFactory",sf); 28 29 // 使用JavaMail发送邮件的5个步骤 30 31 // 1. 创建定义整个应用程序所需要的环境信息的Session对象 32 // 创建定义整个应用程序所需要的环境信息Session对象 33 34 // qq才有 35 Session session=Session.getDefaultInstance(properties, new Authenticator() { 36 @Override 37 protected PasswordAuthentication getPasswordAuthentication() { 38 // 发件人邮件用户名、授权码 39 return new PasswordAuthentication("22453787537@qq.com","feafdhhdfopiubnmweqwwwwww"); 40 } 41 }); 42 43 // 开启session的debug模式,可以查看到程序发送的Email的情况 44 session.setDebug(true); 45 46 // 2. 通过session得到transport对象 47 Transport ts=session.getTransport(); 48 49 // 3.使用邮箱的用户名和授权码连上邮件服务器 50 ts.connect("smtp.qq.com","22453787537@qq.com","eqbtdsshypugchde"); 51 // 4.创建邮件:写邮件 52 // 注意需要传递session 53 54 // 注意需要传递session 55 MimeMessage message=new MimeMessage(session); 56 57 // 指明邮件的发件人 58 message.setFrom(new InternetAddress("31147896524@qq.com")); 59 60 // 指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发 61 message.setRecipient(Message.RecipientType.TO,new InternetAddress("258964713651@qq.com")); 62 63 // 邮件的标题 64 message.setSubject("带有图片的邮件"); 65 /* 66 // 邮件文本的内容 67 message.setContent("<h1 style='color:red'>泥嚎!世界<h1>","text/html;charset=utf-8"); 68 */ 69 //======================================================== 70 71 //准备图片数据 72 MimeBodyPart image=new MimeBodyPart(); 73 //图片需要经过数据处理,DataHandler:数据处理 74 DataHandler dh=new DataHandler(new FileDataSource("src/10.jpg")); 75 image.setDataHandler(dh);//在我们的Body中放入这个处理的图片数据 76 image.setContentID("bz.jpg");//给图片设置一个ID,我们在后面可以使用 77 78 //准备正文数据 79 MimeBodyPart text=new MimeBodyPart(); 80 text.setContent("这是一张带图片的正文<img src='cid:jp.jpg'>","text/html;charset=UTF-8");//cid setcontentid 81 82 //描述数据关系 83 MimeMultipart mm= new MimeMultipart(); 84 mm.addBodyPart(text); 85 mm.addBodyPart(image); 86 mm.setSubType("related"); 87 88 // 设置到消息中,保存修改 89 message.setContent(mm);//把最后编辑好的邮件放到消息中 90 message.saveChanges(); 91 92 93 //======================================================== 94 // 5.发送邮件 95 ts.sendMessage(message,message.getAllRecipients()); 96 97 // 6. 关闭连接 98 ts.close(); 99 100 } 101 }
编写复杂邮件代码(含图片、含附件)

1 public class SendMail { 2 public static void main(String[] args) throws MessagingException, GeneralSecurityException { 3 //1 准备步骤 4 //1.1 创建一个配置文件保存并读取信息 5 Properties properties = new Properties(); 6 //1.2 设置邮件服务器(这里使用了QQ邮箱) 7 properties.setProperty("mail.host","smtp.qq.com"); 8 //1.3 设置发送使用的协议 9 properties.setProperty("mail.transport.protocol","smtp"); 10 //1.4 设置用户是否需要验证 11 properties.setProperty("mail.smtp.auth","true"); 12 //1.5 关于QQ邮箱,还要设置SSL加密,加上以下代码即可 13 MailSSLSocketFactory sf = new MailSSLSocketFactory(); 14 sf.setTrustAllHosts(true); 15 properties.put("mail.smtp.ssl.enable", "true"); 16 properties.put("mail.smtp.ssl.socketFactory", sf); 17 //2 连接服务器 18 //2.1 创建session会话对象 19 Session session = Session.getDefaultInstance(properties, new Authenticator() { 20 @Override 21 protected PasswordAuthentication getPasswordAuthentication() { 22 return new PasswordAuthentication("553401298@qq.com", "jyyylkflmkyybcif"); 23 } 24 }); 25 //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态 26 session.setDebug(true); 27 //2.2 通过session对象获取Transport对象(需要抛出异常) 28 Transport transport = session.getTransport(); 29 //2.3 连接服务器(需要抛出异常) 30 transport.connect("smtp.qq.com","553401298@qq.com","jyyylkflmkyybcif"); 31 //3 发送邮件 32 //3.1 创建用来发送邮件的对象(需要传入session) 33 MimeMessage mimeMessage = new MimeMessage(session); 34 //3.2 创建邮件发送人 35 mimeMessage.setFrom(new InternetAddress("553401298@qq.com")); 36 //3.3 创建邮件接收人(可以同时发送给很多人(添加抄送)) 37 mimeMessage.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress("553401298@qq.com")}); 38 //3.4 创建邮件主题 39 mimeMessage.setSubject("LUCK"); 40 //3.5 创建邮件正文 41 mimeMessage.setContent("GOOD LUCK","text/html;charset=utf-8"); 42 //3.6 发送邮件 43 transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients()); 44 //=================================================================== 45 //4 关闭连接 46 transport.close(); 47 } 48 }
进阶:前端获取用户名、密码、邮箱,再转发
项目结构
1 <%@ page contentType="text/html; charset=utf-8" language="java" %> 2 <html> 3 <head> 4 <title>注册</title> 5 </head> 6 <body> 7 <h2>Hello World!</h2> 8 <form action="${pageContext.request.contextPath}/RegisterServlet.do" method="post"> 9 用户名:<input type="text" name="username"><br> 10 密码:<input type="password" name="password"><br> 11 邮箱:<input type="text" name="email"><br> 12 <input type="submit" value="注册"> 13 </form> 14 </body> 15 </html>

1 package com.kuang.util; 2 3 //三秒原则,三秒内突出重点,否则用户流失->多线程 4 5 import com.kuang.pojo.User; 6 import com.sun.mail.util.MailSSLSocketFactory; 7 8 import javax.mail.*; 9 import javax.mail.internet.InternetAddress; 10 import javax.mail.internet.MimeMessage; 11 import java.security.GeneralSecurityException; 12 import java.security.NoSuchProviderException; 13 import java.util.Properties; 14 15 public class SendMail extends Thread{ 16 //工具类,用来发送邮件 17 //发件邮箱 18 private String from = "553401298@qq.com"; 19 //邮箱的用户名 20 private String username= "553401298@qq.com"; 21 //邮箱的授权码 22 private String password = "jyyylkflmkyybcif"; 23 //邮箱服务器地址 24 private String host = "smtp.qq.com"; 25 private User user; 26 public SendMail(User user){ 27 this.user=user; 28 } 29 @Override 30 public void run() { 31 try { 32 Properties properties = new Properties(); 33 properties.setProperty("mail.host",host); 34 properties.setProperty("mail.transport.protocol","smtp"); 35 properties.setProperty("mail.smtp.auth","true"); 36 MailSSLSocketFactory sf = new MailSSLSocketFactory(); 37 sf.setTrustAllHosts(true); 38 properties.put("mail.smtp.ssl.enable", "true"); 39 properties.put("mail.smtp.ssl.socketFactory", sf); 40 Session session = Session.getDefaultInstance(properties, new Authenticator() { 41 @Override 42 protected PasswordAuthentication getPasswordAuthentication() { 43 return new PasswordAuthentication(username, password); 44 } 45 }); 46 Transport transport = session.getTransport(); 47 transport.connect(host,username,password); 48 //通过MimeMessage设置邮件详情 49 MimeMessage mimeMessage = new MimeMessage(session); 50 mimeMessage.setFrom(new InternetAddress(from)); 51 mimeMessage.setRecipients(Message.RecipientType.TO, new InternetAddress[]{ 52 new InternetAddress(user.getEmail())}); 53 mimeMessage.setSubject("注册成功回执"); 54 mimeMessage.setContent("您已成功注册,您的用户名为:"+user.getUsername() 55 +",密码为:"+user.getPassword() 56 +",请您妥善保管。" 57 ,"text/html;charset=utf-8"); 58 //通过transport对象传输邮件 59 transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients()); 60 transport.close(); 61 } catch (GeneralSecurityException e) { 62 e.printStackTrace(); 63 } catch (Exception e) { 64 e.printStackTrace(); 65 } 66 } 67 }