1

时间:2017年06月07日星期三
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学示例源码:无
个人学习源码:https://github.com/zccodere/s...

第一章:课程介绍

1-1 课程内容介绍

课程内容

理解邮件开发涉及的基本概念
了解SMTP和POP3协议
掌握配置Foxmail
掌握JavaMail发送简单邮件

第二章:邮件相关概念介绍

2-1 JavaMail的概述

JavaMail

JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序。

为什么要学习JavaMail

现在很多的WEB开发都需要使用JavaMail,例如:
1.用户注册后,网站发送一封激活邮件验证。
2.用户过生日,系统发送生日祝福邮件。
3.将最新活动和优惠以邮件的形式告知会员。
这些应用都需要开发人员会使用编程语言发送邮件。

2-2 邮件开发中的相关的术语

电子邮箱

电子邮箱(E-mail地址)需要在邮件服务器上进行申请,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个账户。用户在邮件服务器上申请了一个账户后,邮件服务器就会为这个账号分配一定的空间,用户从而可以使用这个账号以及空间,发送电子邮件和保存别人发送过来的电子邮件。

邮箱服务器

服务器的概念不难理解,应为作为WEB开发人员我们应该更清楚什么是服务器,服务器指的是一台电脑安装了一个服务器软件。那么这台电脑就可以称为是WEB服务器。那么同样的一台电脑安装了邮件服务器软件,那么这台电脑称为是邮箱服务器。要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在网络上有很多提供邮件服务的厂商:新浪、搜狐、网易等等他们都有自己的邮件服务器。

SMTP协议(发送邮件协议)

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,
    它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。
SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。
SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
通常把处理用户SMTP请求(邮件发送请求)的邮件服务器称为SMTP服务器。
默认端口号为25

POP3协议(接收邮件协议)

POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。
是TCP/IP协议族中的一员,由RFC1939 定义。
本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。
提供了SSL加密的POP3协议被称为POP3S。
同样,用户若想从邮件服务器管理的电子邮箱中接收一封电子邮件的话,他连上邮件服务器后,
    也需要遵循一定的通讯格式,POP3协议用于定义这种通讯格式。
因而,通常我们也把处理用户POP3请求(邮件接收请求)的邮件服务器称为POP3服务器。
默认端口号110

2-3 邮件收发过程的介绍

邮件收发过程

clipboard.png

第三章:邮箱服务器和客户端安装及配置

3-1 邮箱服务器的安装和配置

安装软件eyoumailserversetup.exe

安装成功后,修改域名

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的介绍
相关术语
邮件收发过程
邮件服务器搭建和客户端安装
用户注册发送邮件激活

妙手空空
1.3k 声望368 粉丝

博观而约取,厚积而薄发