时间: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 邮件收发过程的介绍
邮件收发过程
第三章:邮箱服务器和客户端安装及配置
3-1 邮箱服务器的安装和配置
安装软件eyoumailserversetup.exe
安装成功后,修改域名
新建账号
3-2 邮箱客户端的安装和配置
安装软件foxmail.exe
安装成功后,登录邮箱
第四章:邮件发送代码实现
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的介绍
相关术语
邮件收发过程
邮件服务器搭建和客户端安装
用户注册发送邮件激活
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。