慕課網_《Java實現郵箱驗證》學習總結

時間:2017年06月07日星期三
說明:本文部份內容均來自慕課網。@慕課網:http://www.imooc.com
教學示例源碼:無
我的學習源碼:https://github.com/zccodere/s...html

第一章:課程介紹

1-1 課程內容介紹

課程內容java

理解郵件開發涉及的基本概念
瞭解SMTP和POP3協議
掌握配置Foxmail
掌握JavaMail發送簡單郵件

第二章:郵件相關概念介紹

2-1 JavaMail的概述

JavaMailmysql

JavaMail,顧名思義,提供給開發者處理電子郵件相關的編程接口。它是Sun發佈的用來處理email的API。它能夠方便地執行一些經常使用的郵件傳輸。咱們能夠基於JavaMail開發出相似於Microsoft Outlook的應用程序。

爲何要學習JavaMailgit

如今不少的WEB開發都須要使用JavaMail,例如:
1.用戶註冊後,網站發送一封激活郵件驗證。
2.用戶過生日,系統發送生日祝福郵件。
3.將最新活動和優惠以郵件的形式告知會員。
這些應用都須要開發人員會使用編程語言發送郵件。

2-2 郵件開發中的相關的術語

電子郵箱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

2-3 郵件收發過程的介紹

郵件收發過程數據庫

clipboard.png

第三章:郵箱服務器和客戶端安裝及配置

3-1 郵箱服務器的安裝和配置

安裝軟件eyoumailserversetup.exeapache

安裝成功後,修改域名

clipboard.png

新建帳號

clipboard.png

3-2 郵箱客戶端的安裝和配置

安裝軟件foxmail.exe

安裝成功後,登陸郵箱

clipboard.png

clipboard.png

第四章:郵件發送代碼實現

4-1 環境搭建

以用戶註冊爲例,當用戶註冊成功以後,向用戶註冊郵箱發送用戶激活郵件。

教學時,使用傳統開發方式,先建數據庫表,而後在開發項目。我在學習時,使用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>

4-2 用戶註冊相關類的建立

代碼演示:

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("-", "");
    }
    
}

4-3 用戶註冊功能代碼實現

代碼演示:

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

}

4-4 發送激活郵件

代碼演示:

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

}

4-5 用戶激活功能代碼實現

代碼演示:

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

}

第五章:課程總結

5-1 課程總結

總結

JavaMial的介紹
相關術語
郵件收發過程
郵件服務器搭建和客戶端安裝
用戶註冊發送郵件激活
相關文章
相關標籤/搜索