如何使用JavaMail發(fā)送郵件
現(xiàn)在很多的網站都提供有用戶注冊功能, 通常我們注冊成功之后就會收到一封來自注冊網站的郵件。郵件里面的內容可能包含了我們的注冊的用戶名和密碼以及一個激活賬戶的超鏈接等信息。今天我們也來實現(xiàn)一個這樣的功能,用戶注冊成功之后,就將用戶的注冊信息以Email的形式發(fā)送到用戶的注冊郵箱當中,實現(xiàn)發(fā)送郵件功能就得借助于JavaMail了。
一、搭建開發(fā)環(huán)境
1.1、創(chuàng)建Web項目
1.2、用戶注冊的Jsp頁面
register.jsp
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <html> <head> <title>注冊頁面</title> </head> <body> <form action="${pageContext.request.contextPath}/servlet/RegisterServlet" 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>
1.3、消息提示頁面
message.jsp
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <html> <head> <title>消息提示頁面</title> </head> <body> ${message} </body> </html>
二、編寫處理用戶注冊處理程序
2.1、開發(fā)封裝用戶注冊信息的domain
User.java
package me.gacl.domain; 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; } }
2.2、編寫郵件發(fā)送功能
發(fā)送郵件是一件非常耗時的事情,因此這里設計一個線程類來發(fā)送郵件
package me.gacl.web.controller; 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 me.gacl.domain.User; /** * @ClassName: Sendmail * @Description: Sendmail類繼承Thread,因此Sendmail就是一個線程類,這個線程類用于給指定的用戶發(fā)送Email * @author: 孤傲蒼狼 * @date: 2015-1-12 下午10:43:48 * */ public class Sendmail extends Thread { //用于給用戶發(fā)送郵件的郵箱 private String from = "gacl@sohu.com"; //郵箱的用戶名 private String username = "gacl"; //郵箱的密碼 private String password = "郵箱密碼"; //發(fā)送郵件的服務器地址 private String host = "smtp.sohu.com"; private User user; public Sendmail(User user){ this.user = user; } /* 重寫run方法的實現(xiàn),在run方法中發(fā)送郵件給指定的用戶 * @see java.lang.Thread#run() */ @Override public void run() { try{ Properties prop = new Properties(); prop.setProperty("mail.host", host); prop.setProperty("mail.transport.protocol", "smtp"); prop.setProperty("mail.smtp.auth", "true"); Session session = Session.getInstance(prop); session.setDebug(true); Transport ts = session.getTransport(); ts.connect(host, username, password); Message message = createEmail(session,user); ts.sendMessage(message, message.getAllRecipients()); ts.close(); }catch (Exception e) { throw new RuntimeException(e); } } /** * @Method: createEmail * @Description: 創(chuàng)建要發(fā)送的郵件 * @Anthor:孤傲蒼狼 * * @param session * @param user * @return * @throws Exception */ public Message createEmail(Session session,User user) throws Exception{ 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() + ",請妥善保管,如有問題請聯(lián)系網站客服!!"; message.setContent(info, "text/html;charset=UTF-8"); message.saveChanges(); return message; } }
2.3、編寫處理用戶注冊的Servlet
package me.gacl.web.controller; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import me.gacl.domain.User; import me.gacl.service.UserService; public class RegisterServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try{ String username = request.getParameter("username"); String password = request.getParameter("password"); String email = request.getParameter("email"); User user = new User(); user.setEmail(email); user.setPassword(password); user.setUsername(username); System.out.println("把用戶信息注冊到數(shù)據庫中"); //用戶注冊成功之后就使用用戶注冊時的郵箱給用戶發(fā)送一封Email //發(fā)送郵件是一件非常耗時的事情,因此這里開辟了另一個線程來專門發(fā)送郵件 Sendmail send = new Sendmail(user); //啟動線程,線程啟動之后就會執(zhí)行run方法來發(fā)送郵件 send.start(); //注冊用戶 //new UserService().registerUser(user); request.setAttribute("message", "恭喜您,注冊成功,我們已經發(fā)了一封帶了注冊信息的電子郵件,請查收,如果沒有收到,可能是網絡原因,過一會兒就收到了??!"); request.getRequestDispatcher("/message.jsp").forward(request, response); }catch (Exception e) { e.printStackTrace(); request.setAttribute("message", "注冊失敗??!"); request.getRequestDispatcher("/message.jsp").forward(request, response); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
程序運行效果如下:
現(xiàn)在很多網站都有這樣的功能,用戶注冊完成之后,網站根據我們注冊時填寫的郵箱給我們一封Email,然后點擊Email中的超鏈接去激活我們的用戶。這種功能就是這樣實現(xiàn)的。
在總結使用JavaMail發(fā)送郵件時發(fā)現(xiàn),將郵件發(fā)送到sina或者sohu的郵箱時,不一定能夠馬上收取得到郵件,總是有延遲,有時甚至會延遲很長的時間,甚至會被當成垃圾郵件來處理掉,或者干脆就拒絕接收,有時候為了看到郵件發(fā)送成功的效果,要等半天,實屬無奈啊。
- 基于SSM框架+Javamail發(fā)送郵件的代碼實例
- 基于java使用JavaMail發(fā)送郵件
- 使用JavaMail發(fā)送郵件保證成功的方法
- JavaMail入門教程之發(fā)送郵件(3)
- JavaWeb中使用JavaMail實現(xiàn)發(fā)送郵件功能實例詳解
- Java使用JavaMail發(fā)送郵件的方法
- Java基于JavaMail實現(xiàn)向QQ郵箱發(fā)送郵件
- JavaWeb中JavaMail創(chuàng)建郵件和發(fā)送郵件
- javamail 發(fā)送郵件的實例代碼分享
- JavaMail發(fā)送(帶圖片和附件)和接收郵件實現(xiàn)詳解(四)