(转载)JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件

  博客源地址:http://www.cnblogs.com/xdp-gacl/p/4220190.html

  现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件。邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息。今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了。

一、搭建开发环境

1.1、创建Web项目

  

1.2、用户注册的Jsp页面

register.jsp

 1 <%@ page language="java" pageEncoding="UTF-8"%>
 2 <!DOCTYPE HTML>
 3 <html>
 4   <head>
 5     <title>注册页面</title>
 6   </head>
 7
 8   <body>
 9     <form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post">
10         用户名:<input type="text" name="username"><br/>
11         密码:<input type="password" name="password"><br/>
12         邮箱:<input type="text" name="email"><br/>
13         <input type="submit" value="注册">
14     </form>
15   </body>
16 </html>

1.3、消息提示页面

message.jsp

 1 <%@ page language="java" pageEncoding="UTF-8"%>
 2 <!DOCTYPE HTML>
 3 <html>
 4   <head>
 5     <title>消息提示页面</title>
 6   </head>
 7
 8   <body>
 9        ${message}
10   </body>
11 </html>

二、编写处理用户注册处理程序

2.1、开发封装用户注册信息的domain

User.java

 1 package me.gacl.domain;
 2
 3 public class User {
 4     private String username;
 5     private String password;
 6     private String email;
 7     public String getUsername() {
 8         return username;
 9     }
10     public void setUsername(String username) {
11         this.username = username;
12     }
13     public String getPassword() {
14         return password;
15     }
16     public void setPassword(String password) {
17         this.password = password;
18     }
19     public String getEmail() {
20         return email;
21     }
22     public void setEmail(String email) {
23         this.email = email;
24     }
25 }

2.2、编写邮件发送功能

  发送邮件是一件非常耗时的事情,因此这里设计一个线程类来发送邮件

 1 package me.gacl.web.controller;
 2
 3 import java.util.Properties;
 4 import javax.mail.Message;
 5 import javax.mail.Session;
 6 import javax.mail.Transport;
 7 import javax.mail.internet.InternetAddress;
 8 import javax.mail.internet.MimeMessage;
 9 import me.gacl.domain.User;
10
11 /**
12 * @ClassName: Sendmail
13 * @Description: Sendmail类继承Thread,因此Sendmail就是一个线程类,这个线程类用于给指定的用户发送Email
14 * @author: 孤傲苍狼
15 * @date: 2015-1-12 下午10:43:48
16 *
17 */
18 public class Sendmail extends Thread {
19         //用于给用户发送邮件的邮箱
20     private String from = "[email protected]";
21         //邮箱的用户名
22     private String username = "gacl";
23         //邮箱的密码
24     private String password = "邮箱密码";
25         //发送邮件的服务器地址
26     private String host = "smtp.sohu.com";
27
28     private User user;
29     public Sendmail(User user){
30         this.user = user;
31     }
32
33     /* 重写run方法的实现,在run方法中发送邮件给指定的用户
34      * @see java.lang.Thread#run()
35      */
36     @Override
37     public void run() {
38         try{
39             Properties prop = new Properties();
40             prop.setProperty("mail.host", host);
41             prop.setProperty("mail.transport.protocol", "smtp");
42             prop.setProperty("mail.smtp.auth", "true");
43             Session session = Session.getInstance(prop);
44             session.setDebug(true);
45             Transport ts = session.getTransport();
46             ts.connect(host, username, password);
47             Message message = createEmail(session,user);
48             ts.sendMessage(message, message.getAllRecipients());
49             ts.close();
50         }catch (Exception e) {
51             throw new RuntimeException(e);
52         }
53     }
54
55     /**
56     * @Method: createEmail
57     * @Description: 创建要发送的邮件
58     * @Anthor:孤傲苍狼
59     *
60     * @param session
61     * @param user
62     * @return
63     * @throws Exception
64     */
65     public Message createEmail(Session session,User user) throws Exception{
66
67         MimeMessage message = new MimeMessage(session);
68         message.setFrom(new InternetAddress(from));
69         message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail()));
70         message.setSubject("用户注册邮件");
71
72         String info = "恭喜您注册成功,您的用户名:" + user.getUsername() + ",您的密码:" + user.getPassword() + ",请妥善保管,如有问题请联系网站客服!!";
73         message.setContent(info, "text/html;charset=UTF-8");
74         message.saveChanges();
75         return message;
76     }
77 }

2.3、编写处理用户注册的Servlet

 1 package me.gacl.web.controller;
 2
 3 import java.io.IOException;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import me.gacl.domain.User;
 9 import me.gacl.service.UserService;
10
11 public class RegisterServlet extends HttpServlet {
12
13     public void doGet(HttpServletRequest request, HttpServletResponse response)
14             throws ServletException, IOException {
15         try{
16             String username = request.getParameter("username");
17             String password = request.getParameter("password");
18             String email = request.getParameter("email");
19             User user = new User();
20             user.setEmail(email);
21             user.setPassword(password);
22             user.setUsername(username);
23
24             System.out.println("把用户信息注册到数据库中");
25             //用户注册成功之后就使用用户注册时的邮箱给用户发送一封Email
26             //发送邮件是一件非常耗时的事情,因此这里开辟了另一个线程来专门发送邮件
27             Sendmail send = new Sendmail(user);
28             //启动线程,线程启动之后就会执行run方法来发送邮件
29             send.start();
30
31             //注册用户
32             //new UserService().registerUser(user);
33             request.setAttribute("message", "恭喜您,注册成功,我们已经发了一封带了注册信息的电子邮件,请查收,如果没有收到,可能是网络原因,过一会儿就收到了!!");
34             request.getRequestDispatcher("/message.jsp").forward(request, response);
35         }catch (Exception e) {
36             e.printStackTrace();
37             request.setAttribute("message", "注册失败!!");
38             request.getRequestDispatcher("/message.jsp").forward(request, response);
39         }
40     }
41
42     public void doPost(HttpServletRequest request, HttpServletResponse response)
43             throws ServletException, IOException {
44         doGet(request, response);
45     }
46 }

  程序运行效果如下:

  

  现在很多网站都有这样的功能,用户注册完成之后,网站根据我们注册时填写的邮箱给我们一封Email,然后点击Email中的超链接去激活我们的用户。这种功能就是这样实现的。

  在总结使用JavaMail发送邮件时发现,将邮件发送到sina或者sohu的邮箱时,不一定能够马上收取得到邮件,总是有延迟,有时甚至会延迟很长的时间,甚至会被当成垃圾邮件来处理掉,或者干脆就拒绝接收,有时候为了看到邮件发送成功的效果,要等半天,实属无奈啊。

时间: 2024-08-11 23:13:52

(转载)JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件的相关文章

JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件

现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了. 一.搭建开发环境 1.1.创建Web项目 1.2.用户注册的Jsp页面 register.jsp 1 <%@ page language="java" p

web应用中使用JavaMail发送邮件

现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了. 一.搭建开发环境 1.1.创建Web项目 1.2.用户注册的Jsp页面 register.jsp 1 <%@ page language="java" p

javaweb学习总结(三十三)——使用JDBC对数据库进行CRUD

javaweb学习总结(三十三)——使用JDBC对数据库进行CRUD 一.statement对象介绍 Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可. Statement对象的executeUpdate方法,用于向数据库发送增.删.改的sql语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化). Statement.executeQuery方法用于向数据库发

javaweb学习总结(五) - - Servlet开发(二)

一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. 例如: <servlet> <servlet-name>ServletDemo2</servlet-name> <servlet-class>com.tanlei.cn.ServletDemo2</servlet-class> <

JavaWeb学习总结(五十)——文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

JavaWeb学习笔记五 会话技术Cookie&amp;Session

什么是会话技术? 例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话技术是帮助服务器记住客户端状态(区分客户端). 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.会话技术就是记录这次会话中客户端的状态与数据的.会话技术分为Cookie和Session: Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端可以清除

javaweb学习总结(五)——Servlet开发(一)

一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤: 1.编写一个Java类,实现servlet接口. 2.把开发好的Java类部署到web服务器中. 按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet 二.Servlet的运行过程 Servlet程序是由WEB

JavaWeb学习总结(五十)——文件上传和下载 http://www.cnblogs.com/xdp-gacl/p/4200090.html

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

javaweb学习总结(四十三)——Filter高级开发

在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求. 一.Decorator设计模式 1.1.Decorator设计模式介绍 当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强: 编写子类,覆盖需增强的方法. 使用Decorator设计模式对方法进行增强. 在阎宏博士的<JAVA与模式>一书中开头是这样