web应用-使用javamail简单实现邮件发送

 准备工作:

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;
	}
	
	
	
}

注意:由于网路或者邮箱机制原因,邮件可能需要等待数分钟才能收到

猜你喜欢

转载自blog.csdn.net/qq_36528311/article/details/86767977
今日推荐