邮箱发送
jar包:mail.jar、activation.jar
函数依赖:
<dependency>
<groupId>javax.mailgroupId>
<artifactId>mailartifactId>
<version>1.4.7version>
dependency>
?
<dependency>
<groupId>javax.activationgroupId>
<artifactId>activationartifactId>
<version>1.1.1version>
dependency>
简介了解
JavaMail是sun公司(现以甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP、POP3、IMAP还有MIME等。我们在使用JavaMail API编写邮件时,无需考虑邮件的底层实现细节,只要调用JavaMail开发包中相应的API类就可以了。
我们可以先尝试发送一封简单的邮件,确保电脑可以连接网络。
简单邮件:
使用JavaMail发送邮件的5个步骤
-
创建定义整个应用程序所需的环境信息的Session对象
//使用JavaMail发送邮件的5个步骤
//1.创建定义整个应用程序所需的环境信息的Session对象
//QQ才有!其它邮箱不用
//1.创建定义整个应用程序所需的环境信息的Session对象
Session session=Session.getDefaultInstance(properties, new Authenticator() {
-
通过session得到transport对象
//2.通过session得到transport对象
Transport transport = session.getTransport(); -
使用邮箱的用户名和授权码连上邮件服务器
//3.使用邮箱的用户名和授权码连上邮件服务器
transport.connect(host,username,password); -
创建邮件
//4.创建邮件:写邮件
//注意需要传递Session
MimeMessage message = new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("2640420434@qq.com"));
//指明邮件的收件人,如果发件人和收件人是一样的,那就是自己给自己发
message.setRecipient(Message.RecipientType.TO,new InternetAddress("1874132880@qq.com"));
//邮件的标题
message.setSubject("欢迎进入邮箱学习(只包含文本的简单邮件)");
//邮件的文本内容
message.setContent("你好!小不点
","text/html;charset=UTF-8");
? -
发送邮件
//5.发送邮件
transport.sendMessage(message,message.getAllRecipients()); -
关闭连接
//6.关闭连接
transport.close();
package com.tang.servlet;
?
import com.sun.mail.util.MailSSLSocketFactory;
?
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;
?
/**
* 发送简单邮件出去,知道发件人的地址和密码(/授权码)就行了
* 可以发送一个邮件给多个人,快速发送
*
* 现在这里就是模仿QQ邮箱来发送信息,先进入自己QQ邮箱,然后再通过smtp...把message发送给你要发送的人,
* 这里运行结束后,就会发送到邮箱中,注意联网!
* AuthenticationFailedException:535 Error QQ邮箱授权认证失败
*/
public class MailDemo01 {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
Properties prop = new Properties();
prop.setProperty("mail.host","smtp.qq.com");//设置为QQ邮件的服务器
prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议为smtp协议
prop.setProperty("mail.smtp.auth","true");//需要验证用户名密码
?
//关于QQ邮箱,还要设置SSL加密,加上以下代码即可,大厂需要加密,其它邮箱可以不用验证
MailSSLSocketFactory socketFactory = new MailSSLSocketFactory();
socketFactory.setTrustAllHosts(true);
prop.put("mail.stmp.ssl.enable","true");
prop.put("mail.stmp.ssl.socketFactory",socketFactory);
?
?
//使用JavaMail发送邮件的5个步骤
//1.创建定义整个应用程序所需的环境信息的Session对象
//QQ才有!其它邮箱不用
Session session=Session.getDefaultInstance(prop, new Authenticator() {
复杂邮件:
带图片的邮件:
package com.tang.servlet; import com.sun.mail.util.MailSSLSocketFactory; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.security.GeneralSecurityException; import java.util.Properties; /** * 带图片和文本的邮件 */ public class MailDemo02 { public static void main(String[] args) throws GeneralSecurityException, MessagingException { Properties prop = new Properties(); prop.setProperty("mail.host","smtp.qq.com");//设置为QQ邮件的服务器 prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议为smtp协议 prop.setProperty("mail.smtp.auth","true");//需要验证用户名密码 //关于QQ邮箱,还要设置SSL加密,加上以下代码即可,大厂需要加密,其它邮箱可以不用验证 MailSSLSocketFactory socketFactory = new MailSSLSocketFactory(); socketFactory.setTrustAllHosts(true); prop.put("mail.stmp.ssl.enable","true"); prop.put("mail.stmp.ssl.socketFactory",socketFactory); //使用JavaMail发送邮件的5个步骤 //1.创建定义整个应用程序所需的环境信息的Session对象 //QQ才有!其它邮箱不用 Session session=Session.getDefaultInstance(prop, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { //发件人邮件用户名和授权码 return new PasswordAuthentication("2640420434@qq.com","pxfsbdgewrmkdhfj"); } }); //开启Session的debug模式,这样就可以查看程序发送email的运行状态 session.setDebug(true); //2.通过session得到transport对象 Transport transport = session.getTransport(); //3.使用邮箱的用户名和授权码连上邮件服务器 transport.connect("smtp.qq.com","2640420434@qq.com","pxfsbdgewrmkdhfj"); //以上就是进入打开你的QQ邮箱 //4.创建邮件:写邮件 //注意需要传递Session MimeMessage message = new MimeMessage(session); //指明邮件的发件人 message.setFrom(new InternetAddress("2640420434@qq.com")); //指明邮件的收件人,如果发件人和收件人是一样的,那就是自己给自己发 message.setRecipient(Message.RecipientType.TO,new InternetAddress("1874132880@qq.com")); //邮件的标题 message.setSubject("欢迎进入复杂邮箱学习(只包含文本的简单邮件)"); //=============================================================== //编写复杂的邮件内容//复杂的邮件发送,就是设置里面的内容 //准备图片数据 MimeBodyPart image = new MimeBodyPart(); DataHandler dataHandler = new DataHandler(new FileDataSource("C:\\我的文档\\picture\\猫.jpg")); image.setDataHandler(dataHandler); image.setContentID("zp.jpg"); //准备正文的数据MimeBodyPart text =new MimeBodyPart(); text.setContent("这是一封邮件正文带图片
的邮件","text/html;charset=UTF-8"); //描述数据关系 MimeMultipart mimeMultipart = new MimeMultipart(); mimeMultipart.addBodyPart(text); mimeMultipart.addBodyPart(image); mimeMultipart.setSubType("related"); //设置到消息中,保存修改 message.setContent(mimeMultipart);//把最后编辑好的邮件放到消息当中 message.saveChanges();//保存修改! //以上就是带图片的邮件内容 //====================================================================== //5.发送邮件 transport.sendMessage(message,message.getAllRecipients()); //6.关闭连接 transport.close(); } }
注意:使用了一个大部件MimeMultipart和它的子部件MimeBodyPart来实现拼接
message.setContent()里面只能放MimeMultipart对象
带附件的邮件
Multipart: 多部分部件
BodyPart: 单个子部件
package com.tang.servlet; import com.sun.mail.util.MailSSLSocketFactory; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.*; import java.security.GeneralSecurityException; import java.util.Properties; /** * 带附件的邮件 */ public class MailDemo03 { public static void main(String[] args) throws GeneralSecurityException, MessagingException { Properties prop = new Properties(); prop.setProperty("mail.host","smtp.qq.com");//设置为QQ邮件的服务器 prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议为smtp协议 prop.setProperty("mail.smtp.auth","true");//需要验证用户名密码 //关于QQ邮箱,还要设置SSL加密,加上以下代码即可,大厂需要加密,其它邮箱可以不用验证 MailSSLSocketFactory socketFactory = new MailSSLSocketFactory(); socketFactory.setTrustAllHosts(true); prop.put("mail.stmp.ssl.enable","true"); prop.put("mail.stmp.ssl.socketFactory",socketFactory); //使用JavaMail发送邮件的5个步骤 //1.创建定义整个应用程序所需的环境信息的Session对象 //QQ才有!其它邮箱不用 Session session=Session.getDefaultInstance(prop, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { //发件人邮件用户名和授权码 return new PasswordAuthentication("2640420434@qq.com","dtneemrvqfghdiga"); } }); //开启Session的debug模式,这样就可以查看程序发送email的运行状态 session.setDebug(true); //2.通过session得到transport对象 Transport transport = session.getTransport(); //3.使用邮箱的用户名和授权码连上邮件服务器 transport.connect("smtp.qq.com","2640420434@qq.com","dtneemrvqfghdiga"); //以上就是进入打开你的QQ邮箱 //=========================================================== //4.连接上之后我们需要发送邮件 MimeMessage message=imageMail(session); //============================================================ //5.发送邮件 transport.sendMessage(message,message.getAllRecipients()); //6.关闭连接 transport.close(); } public static MimeMessage imageMail(Session session) throws MessagingException { //消息的固定信息 MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress("2640420434@qq.com")); //指明邮件的发件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress("1874132880@qq.com"));//指明邮件的收件人 message.setSubject("欢迎进入带附件邮箱学习(只包含文本的简单邮件)"); //邮件的标题 //=============================================================== //编写复杂带附件的邮件内容 //准备图片数据 MimeBodyPart body1 = new MimeBodyPart(); DataHandler dataHandler = new DataHandler(new FileDataSource("C:\\我的文档\\picture\\猫.jpg")); body1.setDataHandler(dataHandler); body1.setContentID("zp.jpg"); //文本MimeBodyPart body2 =new MimeBodyPart(); body2.setContent("这是一封邮件正文带图片的邮件
","text/html;charset=UTF-8"); //附件 MimeBodyPart body3 = new MimeBodyPart(); body3.setDataHandler(new DataHandler(new FileDataSource("src/resources/log4j.properties"))); body3.setFileName("log4j.properties");//设置附件名字 MimeBodyPart body4 = new MimeBodyPart(); body4.setDataHandler(new DataHandler(new FileDataSource("src/resources/1.txt"))); body4.setFileName("1.txt");//设置附件名字 //============================================================== //拼接邮件正文内容 MimeMultipart mimeMultipart1 = new MimeMultipart(); mimeMultipart1.addBodyPart(body1); mimeMultipart1.addBodyPart(body2); mimeMultipart1.setSubType("related");//-------1.将文本和图片内嵌成功,变为一个大模块 //将拼接好的正文内容设置为主体 MimeBodyPart contentText = new MimeBodyPart(); contentText.setContent(mimeMultipart1);//将文本和图片放为一起,然后又变为一个子模块 //以上的这个可以不用写,直接allFile.addBodyPart(body1);allFile.addBodyPart(body2);添加正文 //上面是将正文附件整合为一个小模块而已,然后再让allFile对象去添加进去这个小模块 //================================================================== //拼接附件 MimeMultipart allFile = new MimeMultipart(); allFile.addBodyPart(body3);//附件 allFile.addBodyPart(body4);//附件 allFile.addBodyPart(contentText);//正文 /* allFile.addBodyPart(body1);//正文 allFile.addBodyPart(body2);*/ allFile.setSubType("mixed");//将正文和附件都存在邮件中,所有类型设置为mixed //=================================================================== //设置到消息中,保存修改 message.setContent(allFile);//把最后编辑好的邮件放到消息当中 message.saveChanges();//保存修改! return message; } }
注意:附件是setFileName(),而图片是setContentID()
图片要添加到文本中的,而附件不用
MimeMultipart类要设置里面的类型setSubType(“alternative”/“related”/“mixed”)
注意:可以将这个正文设为一体放入一个容器MimeMultipart中,然后再将这个容器变为子模块MimeBodyPart,然后再添加到大模块中
正常思想是可以不用这么复杂,直接将附件和图片和文本添加到一个大模块中就行了
web项目添加邮箱发送功能
如:注册用户
pojo实体类
package com.tang.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; /** * lombok * @Data //快速生成get,set,toString * @AllArgsConstructor //快速生成有参构造 * @NoArgsConstructor //快速生成无参构造 */ public class User implements Serializable { private String username; private String password; private String email; public User() { } public User(String username, String password, String email) { this.username = username; this.password = password; this.email = email; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "User{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + '}'; } }
前端代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>Mails注册
<%--页面跳转,写好看点,用来提高用户的体验--%> <%@ page contentType="text/html;charset=UTF-8" language="java" %>注册成功 网站温馨提示:
${message}
写一个发送的工具类,这个类用线程来运行
package com.tang.utils; import com.sun.mail.util.MailSSLSocketFactory; import com.tang.pojo.User; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.security.GeneralSecurityException; import java.util.Properties; //网站3秒原则:增强用户体验 //多线程实现用户体验(采用异步处理)!! public class Sendmail extends Thread{ //用于给用户发送邮件的邮箱 private String from="2640420434@qq.com"; //邮箱的用户名 private String username="2640420434@qq.com"; //邮箱的密码 private String password="dtneemrvqfghdiga"; //发送邮件的服务器的地址 private String host="smtp.qq.com"; private User user; public Sendmail(User user){ this.user=user; } //重写run方法的实现,在run方法中发送邮件给指定的用户 @Override public void run() { try { Properties properties = new Properties(); properties.setProperty("mail.host",host); properties.setProperty("mail.transport.protocol","smtp"); properties.setProperty("mail.smtp.auth","true"); //关于QQ邮箱,还要设置SSL加密,加上以下代码即可,大厂需要加密,其它邮箱可以不用验证 MailSSLSocketFactory socketFactory = null; socketFactory = new MailSSLSocketFactory(); socketFactory.setTrustAllHosts(true); properties.put("mail.smtp.ssl.enable","true"); properties.put("mail.smtp.ssl.socketFactory",socketFactory); //1.创建定义整个应用程序所需的环境信息的Session对象 Session session=Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { //发件人邮件用户名和授权码 return new PasswordAuthentication(username,password); } }); //开启Session的debug模式,这样就可以查看程序发送email的运行状态 session.setDebug(true); //2.通过session得到transport对象 Transport transport = session.getTransport(); //3.使用邮箱的用户名和授权码连上邮件服务器 transport.connect(host,username,password); //4.邮件编写 MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from));//发件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail()));//收件人 message.setSubject("用户注册邮件");//邮件的标题 String info="恭喜您注册成功,您的用户名: "+user.getUsername()+",您的密码:"+user.getPassword()+",请妥善保管,如有问题拨打:000"; message.setContent(info,"text/html;charset=UTF-8"); message.saveChanges(); //5.发送邮件 transport.sendMessage(message,message.getAllRecipients()); //6.关闭连接 transport.close(); } catch (GeneralSecurityException e) { e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); } } }
写Servlet
package com.tang.servlet; import com.tang.pojo.User; import com.tang.utils.Sendmail; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; //脚手架:就是一个基本模型架构,然后呢往里面添加功能即可 public class RegisterServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //接收用户请求,封装成对象 String username = req.getParameter("username"); String password = req.getParameter("password"); String email = req.getParameter("email"); User user = new User(username, password, email); //用户注册成功后,给用户发送一封邮件 //我们使用线程来专门发送邮件,防止出现耗时,和网站注册人数过多的情况 Sendmail sendmail = new Sendmail(user); sendmail.start();//注意这里是开启线程了,开启线程不能是直接调用run():---sendmail.run() //注册用户 req.setAttribute("message","注册成功,我们已经发了一封注册信息,请查收!如网络不稳定,可能过会才能收到"); req.getRequestDispatcher("/info.jsp").forward(req,resp); //问:如果发送失败,会不会跳转到这个页面 // 会 } }
注册Servlet
RegisterServlet com.tang.servlet.RegisterServlet RegisterServlet /RegisterServlet.do
扩展:
选中模块然后点击鼠标右键 添加框架支持
快速生成实体类工具jar包:
两个版本都行org.projectlombok lombok 1.16.10 org.projectlombok lombok 1.18.20 provided
导入jar包到项目中
SpringBoot来实现邮箱发送
创建一个SpringBoot空项目
添加邮箱jar包
org.springframework.boot spring-boot-starter-mail
编写mail的配置文件application.properties,让它去连接邮箱服务器
spring.mail.username=2640420434@qq.com spring.mail.password=dtneemrvqfghdiga spring.mail.host=smtp.qq.com spring.mail.properties.mail.smtp.ssl.enable=true
在DemoApplicationTests.java中编写具体实现
package com.example.demo; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.test.context.junit4.SpringRunner; import javax.mail.internet.MimeMessage; import java.io.File; @RunWith(SpringRunner.class) @SpringBootTest class DemoApplicationTests { @Autowired JavaMailSenderImpl mailSender; @Test void contextLoads() { //发送邮件 //收件人 //内容 SimpleMailMessage message = new SimpleMailMessage(); message.setSubject("JavaSpringBoot邮箱");//标题 message.setText("Hello");//主体 message.setFrom("2640420434@qq.com");//发件人 message.setTo("1874132880@qq.com");//收件人 mailSender.send(message); } //加上附件 @Test public void test1()throws Exception{ MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); helper.setSubject("JavaSpringBoot邮箱");//标题 helper.setText("Hello
",true);//主体 //附件 helper.addAttachment("1.jpg",new File("C:\\我的文档\\picture\\猫.jpg")); helper.addAttachment("2.jpg",new File("C:\\我的文档\\picture\\无标题.png")); helper.addAttachment("3.docx",new File("C:\\我的文档\\文档\\IDM加速使用.docx")); helper.addAttachment("4.xltx",new File("C:\\我的文档\\文档\\Excel模板\\每天工作日历.xltx")); helper.setFrom("2640420434@qq.com");//发件人 helper.setTo("1874132880@qq.com");//收件人 mailSender.send(mimeMessage); } }