准备工作:
1、各类邮箱,本文使用搜狗邮箱、QQ邮箱:由搜狗邮箱发送邮件到用户QQ邮箱
2、在这两个邮箱设置中开启POP3/SMTP服务,以便第三方软件访问,如不开启将无法实现邮件的收发
2.1相关协议
不依赖于协议的方式发送接收电子信息,只依赖特定协议SMTP、POP、IMAP、MIME、NNTP协议。
1.SMTP(递送邮件机制)
简单邮件传输协议
SMTP服务器将邮件转发到接收者的SMTP服务器,直至最后被接收者通过POP或者IMAP协议获取。
2.POP(获取邮件机制)
邮局协议,目前为第3个版本POP3
3.IMAP(多目录共享)
接收信息的高级协议,目前版本为第4版IMAP4
接收新信息,将这些信息递送给用户,维护每个用户的多个目录。
4.MIME
邮件扩展内容格式:信息格式、附件格式等等
5.NNTP
第三方新闻组协议
3、架包:我们需要用到activation.jar、mail.jar 两个架包,请自行百度下载
4、建包:
代码如下:
servlet:
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import SendMail.Sendmails;
import SendMail.sendmail;
import User.User;
/**
* Servlet implementation class registerServlet
*/
@WebServlet("/registerServlet")
public class registerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public registerServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
try {
/*
* 获取输入框中的信息,得到User对象
*/
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
System.out.println("用户名为 "+username);
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
Sendmails sendmails= new Sendmails(user);
sendmails.start();//由于发送邮件时间较长,开启线程发送邮件
request.setAttribute("message", "恭喜您,注册成功,我们已经发了一封带了注册信息的电子邮件,请查收,因网络原因可能有延迟,请耐心等待");
request.getRequestDispatcher("/jsp/message.jsp").forward(request, response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
request.setAttribute("message", "注册失败!!");
request.getRequestDispatcher("/jsp/message.jsp").forward(request, response);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
/*
* 编码设置:
* 下面两句话一定需要,否则将出现乱码问题
*/
response.setContentType("text/html;charset=utf-8");//设置响应到页面的文本编码
request.setCharacterEncoding("utf-8");//设置客户端传过来的字符编码
doGet(request, response);
}
}
实体类User :
package User;
public class User {
private String username;
private String password;
private String 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;
}
}
注册页面:
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>注册页面</title>
</head>
<body>
<!--在设置路径时注意:${pageContext.request.contextPath}/registerServlet中
${pageContext.request.contextPath}得到的是当前项目路径,/registerServlet是映射路径(在项目web.xml中有所体现)
-->
<form action="${pageContext.request.contextPath}/registerServlet" method="post" accept-charset="UTF-8">
用户名:<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>
邮件发送:此处邮箱号、用户名、密码请本人准确填写
package SendMail;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import User.User;
public class Sendmails extends Thread{//利用线程发送邮件
//用于给用户发送邮件的邮箱
private String from = "邮箱";
//邮箱的用户名
private String username = "用户名";
//邮箱的密码
private String password = "密码";
//发送邮件的服务器地址
private String host = "smtp.sohu.com";
private User user;
public Sendmails(User user){
this.user = user;
}
@Override
public void run() {
// TODO Auto-generated method stub
/*
* setProperty ( String key, String value) ,调用 Hashtable 的方法 put 。他通过调用基类的put方法来设置 键-值对。
* 创建配置文件并赋键值
*/
Properties properties = new Properties();
properties.setProperty("mail.host", host);
properties.setProperty("mail.transport.protocol", "smtp");
properties.setProperty("mail.smtp.auth", "true");
try {
/*
* 发送邮件6步骤
*/
/*
* 1、通过读取配置文件中的内容创建Session对象
* 注意: getDefaultInstance,如果之前存在先加载,不存在再提取,getInstance直接提取
*/
Session session = Session.getInstance(properties);
//2、设置debug模式,监控邮件发送过程
session.setDebug(true);
//3、通过session创建传输对象
Transport ts= session.getTransport();
/*
* 4、获取连接:提供邮箱服务器地址、用户名、密码
* 注意:根据邮箱种类的不同,密码代表的意义也不同,例如搜狐邮箱密码就是你的登录密码、QQ邮箱密码是开启smtp服务时的授权码
*/
ts.connect(host, username, password);
//5、编辑邮件
Message message = creatMail(session,user);
//6、发送
ts.sendMessage(message, message.getAllRecipients());
ts.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private Message creatMail(Session session,User user) throws Exception{
// TODO Auto-generated method stub
MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.setFrom(new InternetAddress(from));//编辑发送人地址
mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail()));//编辑收信人地址
mimeMessage.setSubject("用户注册邮件");//邮件标题
String info = "恭喜您注册成功,您的用户名为 "+user.getUsername()+"您的密码为 "+user.getPassword()+" 请妥善保管!";
mimeMessage.setContent(info, "text/html;charset=UTF-8");//设置邮件内容
mimeMessage.saveChanges();//保存邮件
return mimeMessage;
}
}
注意:由于网路或者邮箱机制原因,邮件可能需要等待数分钟才能收到