時間:2017年06月07日星期三
說明:本文部份內容均來自慕課網。@慕課網:http://www.imooc.com
教學示例源碼:無
我的學習源碼:https://github.com/zccodere/s...html
課程內容java
理解郵件開發涉及的基本概念 瞭解SMTP和POP3協議 掌握配置Foxmail 掌握JavaMail發送簡單郵件
JavaMailmysql
JavaMail,顧名思義,提供給開發者處理電子郵件相關的編程接口。它是Sun發佈的用來處理email的API。它能夠方便地執行一些經常使用的郵件傳輸。咱們能夠基於JavaMail開發出相似於Microsoft Outlook的應用程序。
爲何要學習JavaMailgit
如今不少的WEB開發都須要使用JavaMail,例如: 1.用戶註冊後,網站發送一封激活郵件驗證。 2.用戶過生日,系統發送生日祝福郵件。 3.將最新活動和優惠以郵件的形式告知會員。 這些應用都須要開發人員會使用編程語言發送郵件。
電子郵箱github
電子郵箱(E-mail地址)須要在郵件服務器上進行申請,確切地說,電子郵箱其實就是用戶在郵件服務器上申請的一個帳戶。用戶在郵件服務器上申請了一個帳戶後,郵件服務器就會爲這個帳號分配必定的空間,用戶從而可使用這個帳號以及空間,發送電子郵件和保存別人發送過來的電子郵件。
郵箱服務器web
服務器的概念不難理解,應爲做爲WEB開發人員咱們應該更清楚什麼是服務器,服務器指的是一臺電腦安裝了一個服務器軟件。那麼這臺電腦就能夠稱爲是WEB服務器。那麼一樣的一臺電腦安裝了郵件服務器軟件,那麼這臺電腦稱爲是郵箱服務器。要在Internet上提供電子郵件功能,必須有專門的電子郵件服務器。例如如今網絡上有不少提供郵件服務的廠商:新浪、搜狐、網易等等他們都有本身的郵件服務器。
SMTP協議(發送郵件協議)spring
SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議, 它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。 SMTP協議屬於TCP/IP協議簇,它幫助每臺計算機在發送或中轉信件時找到下一個目的地。 SMTP協議所指定的服務器,就能夠把E-mail寄到收信人的服務器上了,整個過程只要幾分鐘。 SMTP服務器則是遵循SMTP協議的發送郵件服務器,用來發送或中轉發出的電子郵件。 一般把處理用戶SMTP請求(郵件發送請求)的郵件服務器稱爲SMTP服務器。 默認端口號爲25
POP3協議(接收郵件協議)sql
POP3,全名爲「Post Office Protocol - Version 3」,即「郵局協議版本3」。 是TCP/IP協議族中的一員,由RFC1939 定義。 本協議主要用於支持使用客戶端遠程管理在服務器上的電子郵件。 提供了SSL加密的POP3協議被稱爲POP3S。 一樣,用戶若想從郵件服務器管理的電子郵箱中接收一封電子郵件的話,他連上郵件服務器後, 也須要遵循必定的通信格式,POP3協議用於定義這種通信格式。 於是,一般咱們也把處理用戶POP3請求(郵件接收請求)的郵件服務器稱爲POP3服務器。 默認端口號110
郵件收發過程數據庫
安裝軟件eyoumailserversetup.exeapache
安裝成功後,修改域名
新建帳號
安裝軟件foxmail.exe
安裝成功後,登陸郵箱
以用戶註冊爲例,當用戶註冊成功以後,向用戶註冊郵箱發送用戶激活郵件。
教學時,使用傳統開發方式,先建數據庫表,而後在開發項目。我在學習時,使用JPA技術,基於實體對象模型進行自動建立表。
構建工具:maven
使用框架:Spring Boot
POM文件以下
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.myimooc</groupId> <artifactId>myregistweb</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>myregistweb</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.5.3.RELEASE</version> </plugin> </plugins> </build> </project>
用戶註冊頁面代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"/> <title>用戶註冊頁面</title> </head> <body> <form action="/regist" method="post"> <table width="600" border="1"> <tr> <td>用戶名</td> <td><input type="text" name="username"/> </td> </tr> <tr> <td>密碼</td> <td><input type="password" name="password"/> </td> </tr> <tr> <td>暱稱</td> <td><input type="text" name="nickname"/> </td> </tr> <tr> <td>郵箱</td> <td><input type="text" name="email"/> </td> </tr> <tr> <td colspan="2"><input type="submit" value="註冊"/> </td> </tr> </table> </form> </body> </html>
代碼演示:
1.編寫領域模型User類
package com.myimooc.myregistweb.domain; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class User { @Id @GeneratedValue private Integer uid; private String username; private String password; private String nickname; private String email; private Integer state; private String code; public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } 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 getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Integer getState() { return state; } public void setState(Integer state) { this.state = state; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } }
2.編寫工具類UuidUtils類
package com.myimooc.myregistweb.util; import java.util.UUID; /** * 生成隨機字符串工具類 * @create ZhangCheng by 2017-06-08 * */ public class UuidUtils { public static String getUuid(){ return UUID.randomUUID().toString().replace("-", ""); } }
代碼演示:
1.編寫UserRepository類
package com.myimooc.myregistweb.dao; import org.springframework.data.jpa.repository.JpaRepository; import com.myimooc.myregistweb.domain.User; public interface UserRepository extends JpaRepository<User, Integer> { User findByCode(String code); }
2.編寫UserService類
package com.myimooc.myregistweb.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.myimooc.myregistweb.dao.UserRepository; import com.myimooc.myregistweb.domain.User; import com.myimooc.myregistweb.util.MailUtils; @Service public class UserService { @Autowired private UserRepository userRepository; /** * 用戶註冊的方法 * @param user */ public void regist(User user){ // 將數據存入到數據庫 userRepository.save(user); // 發送一封激活郵件 try { MailUtils.sendMail(user.getEmail(), user.getCode()); } catch (Exception e) { // e.printStackTrace(); System.out.println("郵件發送異常"); } } /** * 用戶激活的方法 * @param user */ public boolean registActive(String code){ User user = userRepository.findByCode(code); if( null == user){ return false; } user.setState(1); user.setCode(""); userRepository.save(user); return true; } }
3.編寫UserController類
package com.myimooc.myregistweb.web.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import com.myimooc.myregistweb.domain.User; import com.myimooc.myregistweb.service.UserService; import com.myimooc.myregistweb.util.UuidUtils; @Controller public class RegistController { @Autowired private UserService userService; /** * 跳轉到註冊頁面 * @return */ @GetMapping("/regist") public ModelAndView toRegistPage(){ return new ModelAndView("regist"); } /** * 處理用戶註冊請求 * @return */ @PostMapping("/regist") public ModelAndView regist(User user){ user.setState(0);// 0,未激活;1,已激活 String code = UuidUtils.getUuid()+UuidUtils.getUuid(); user.setCode(code); // 調用業務層處理數據 userService.regist(user); // 頁面跳轉 return new ModelAndView("regist"); } /** * 處理用戶激活請求 * @return */ @GetMapping("/regist/active") @ResponseBody public Object registActive(@RequestParam("code") String code){ boolean result = userService.registActive(code); return "激活狀態:"+result; } }
代碼演示:
package com.myimooc.myregistweb.util; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMessage.RecipientType; /** * 郵件發送工具類 * @create ZhangCheng by 2017-06-08 * */ public class MailUtils { /** * 發送郵件的方法 * @param to 收件人郵箱地址 * @param code 郵件的激活碼 */ public static void sendMail(String to,String code) throws Exception{ // 1.建立鏈接對象,鏈接到郵箱服務器 Properties props = new Properties(); Session session = Session.getInstance(props, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("service@zccoder.com", "123"); } }); // 2.建立郵件對象 Message message = new MimeMessage(session); // 設置發件人 message.setFrom(new InternetAddress("service@zccoder.com")); // 設置收件人 message.setRecipient(RecipientType.TO, new InternetAddress(to)); // 設置郵件主題 message.setSubject("來自zccoder的帳號激活郵件"); // 設置郵件的正文 message.setContent("<h1>來自zccoder的帳號激活郵件,激活請點擊一下連接:</h1><h3><a href='http://localhost:8080/regist/active?code="+code+"'>http://localhost:8080/regist/active?code="+code+"</h3>", "text/html;charset=UTF-8"); // 3.發送一封激活郵件 Transport.send(message); } }
代碼演示:
package com.myimooc.myregistweb.web.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import com.myimooc.myregistweb.domain.User; import com.myimooc.myregistweb.service.UserService; import com.myimooc.myregistweb.util.UuidUtils; @Controller public class RegistController { @Autowired private UserService userService; /** * 跳轉到註冊頁面 * @return */ @GetMapping("/regist") public ModelAndView toRegistPage(){ return new ModelAndView("regist"); } /** * 處理用戶註冊請求 * @return */ @PostMapping("/regist") public ModelAndView regist(User user){ user.setState(0);// 0,未激活;1,已激活 String code = UuidUtils.getUuid()+UuidUtils.getUuid(); user.setCode(code); // 調用業務層處理數據 userService.regist(user); // 頁面跳轉 return new ModelAndView("regist"); } /** * 處理用戶激活請求 * @return */ @GetMapping("/regist/active") @ResponseBody public Object registActive(@RequestParam("code") String code){ boolean result = userService.registActive(code); return "激活狀態:"+result; } }
總結
JavaMial的介紹 相關術語 郵件收發過程 郵件服務器搭建和客戶端安裝 用戶註冊發送郵件激活