一、电子邮件
要在网络上实现邮件功能,必须要有专门的邮件服务器。
这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
SMTP服务器地址:一般是smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。
电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请。比如我们要使用QQ邮箱,就需要开通邮箱功能;
二、传输协议
SMTP协议
发送邮件:
我们通常把处理用户SMTP请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
POP3协议
接收邮件:
我们通常把处理用户POP3请求(邮件接受请求)的服务器称之为POP3服务器(邮件接收服务器)。
三、邮件收发原理
1.张三通过smtp协议连接到Smtp服务器,然后发送一封邮件给网易的邮件服务器
2.网易分析发现需要去QQ的邮件服务器,通过smtp协议将邮件转投给QQ的Smtp服务器
3.QQ将接收到的邮件存储在xxxxx@qq.com这个邮件账号的空间中
4.李四通过Pop3协议连接到Pop3服务器收取邮件
5.从xxxxx@qq.com这个邮件账号的空间中取出邮件
6.Pop3服务器将取出来的邮件送到李四手中
四、Java发送邮件
概述
核心API介绍:
-
Message类
javax.mail.Message 类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。客户端程序发送邮件时,首先使用创建邮件的API,将要创建邮件的数据封装到Message对象中,然后把这个对象传递给邮件发送API发送出去。客户端程序接收邮件时,邮件接收API把接收到的邮件数据封装在Message类的实例对象中,客户端程序再使用邮件解析API,从这个对象中解析出接收到的邮件数据。
-
Session类
javax.mail.Session 类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些会话信息构建邮件收发的Store和Transport对象,以及为客户端创建Message对象提供信息支持。
-
Transport类
javax.mail.Transport 类是发送邮件的核心API类,它的实例对象,代表实现了某个邮件发送协议的邮件发送对象,例如SMTP 协议。客户端程序创建好Message对象后,只需要使用邮件发送API得到 Transport 对象,然后把 Message 对象传递给 Transport 对象,并调用它的发送方法,就可以把邮件发送给指定的SMTP服务器。
代码执行
我们将用代码完成邮件的发送。这在实际项目中应用非常广泛,比如注册需要通过发送邮件进行账号激活,又比如OA项目中利用邮件进行任务提醒等等。
使用Java发送E-mail非常简单,首先准备好JavaMail API和Java Activation Framework.准备两个jar包(点击网页中的Files中的jar进行下载):
JavaMail是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包, 它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME等。我们在使用JavaMail API编写邮件时,无须考虑邮 件的底层实现细节,只要调用JavaMail开发包中相应的API类就可以了。
项目依赖
将上面两个jar包导入到项目之中
pom.xml lombok不做硬性要求(我只是想偷懒😜)
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> </dependency> </dependencies>
web.xml
<servlet> <servlet-name>RegisterServlet</servlet-name> <servlet-class>com.feng.servlet.RegisterServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>RegisterServlet</servlet-name> <url-pattern>/RegisterServlet.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>register.jsp</welcome-file> </welcome-file-list>
前端注册表单
register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>注册</title> </head> <body> <form action="${pageContext.request.contextPath}/RegisterServlet.do"method="post"> 用户名:<input type="text" name="username"><br/> 密码:<input type="password" name="password"><br/> 邮箱:<input type="text" name="email"><br/> <input type="submit" value="注册"> </form> </body> </html>
JavaBean
User.java 不使用lombok需要生成getter和setter,无参有参以及toString方法
package com.feng.bean; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class User { private String username; private String password; private String email; }
Servlet
RegisterServlet.java
package com.feng.servlet; import com.feng.bean.User; import com.feng.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 doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } @Override protected void doGet(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 send=new Sendmail(user); send.start(); //注册用户 req.setAttribute("message","注册成功,我们已发送邮件,请注意查收"); req.getRequestDispatcher("info.jsp").forward(req,resp); } }
utils(发送邮件的工具类)
Sendmail.java
qq邮箱发送邮件时需要使用授权码和设置ssl加密(大厂就是要与众不同😒) 授权码需要在邮箱设置->账号->服务中获取
package com.feng.utils; import com.feng.bean.User; import com.sun.mail.util.MailSSLSocketFactory; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class Sendmail extends Thread{ //用于给用户发送邮件的邮箱 private String from="491469504@qq.com"; //邮箱的用户名 private String username="491469504@qq.com"; //邮箱的密码(qq邮箱授权码) private String password="rbbgyfhqykzibgei"; //发送邮件的服务器地址 private String host="smtp.qq.com"; private User user; public Sendmail(User user) { this.user=user; } //重写run方法的实现,在run方法中发送邮件给指定用户 @Override public void run(){ try { Properties prop=new Properties(); prop.setProperty("mail.host",host);//设置QQ邮件服务器 prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议 prop.setProperty("mail.smtp.auth","true");//需要验证用户名密码 //qq需要设置ssl加密 MailSSLSocketFactory sf=new MailSSLSocketFactory(); sf.setTrustAllHosts(true); prop.put("mail.smtp.ssl.enable","true"); prop.put("mail.smtp.ssl.socketFactory",sf); //创建定义整个应用程序所需的环境信息的Session对象 Session session=Session.getDefaultInstance(prop, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { //发件人邮件用户名,授权码 return new PasswordAuthentication(username,password);//授权码 } }); //设置调制信息在控制台打印出来 session.setDebug(true); //通过session得到transport对象 Transport ts=session.getTransport(); //使用邮箱用户名和授权码连上邮件服务器 ts.connect(host,username,password); //创建邮件对象 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(); message.setContent(info,"text/html;charset=UTF-8"); message.saveChanges(); //发送邮件 ts.sendMessage(message,message.getAllRecipients()); ts.close(); } catch (Exception e) { e.printStackTrace(); } } }
注册成功后转到页面
info.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>温馨提示</h1> ${message} </body> </html>
五、温馨提示
tomcat服务器启动后报500错误
此错误大概率是因为没找到导入的jar包,在模块设置中的工件页面右侧检查web-inf中有没有那两个jar,没有的话导入,重启服务器
如果还是报500,应该是tomcat中没有那两个jar包,将那两个jar包复制粘贴到tomcat文件夹中的lib文件夹中,再重启服务器应该就可以了