后端发送邮件实现认证
·
邮件服务配置
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=your-email@gmail.com
spring.mail.password=your-email-password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
1. spring.mail.host
spring.mail.host=smtp.gmail.com
- 作用:指定邮件服务器的主机地址。
smtp.gmail.com:这是 Gmail 的 SMTP 服务器地址,用于通过 Gmail 发送邮件。- 如果使用其他邮件服务(如 QQ 邮箱、Outlook 等),需要替换为对应的 SMTP 服务器地址。例如:
- QQ 邮箱:
smtp.qq.com - Outlook:
smtp.office365.com
- QQ 邮箱:
2. spring.mail.port
spring.mail.port=587
- 作用:指定邮件服务器的端口号。
587:这是 SMTP 的默认端口,用于支持 STARTTLS 加密的邮件发送。- 如果使用其他端口:
- 465:用于 SSL 加密的 SMTP 端口。
- 25:非加密的 SMTP 端口(不推荐)。
3. spring.mail.username
spring.mail.username=your-email@gmail.com
- 作用:指定发送邮件的邮箱地址。
your-email@gmail.com:这是发送邮件的邮箱账号,必须是一个有效的邮箱地址。- 例如,如果使用 QQ 邮箱,可以改为
your-email@qq.com。
4. spring.mail.password
spring.mail.password=your-email-password
- 作用:指定发送邮件的邮箱密码。
- 注意:
- 如果使用 Gmail,不能直接使用邮箱登录密码,而是需要生成 应用专用密码。
- 应用专用密码 是 Gmail 提供的一种安全机制,用于第三方应用访问 Gmail。
- 生成应用专用密码的方法:
- 登录 Gmail。
- 打开 Google 账户安全设置。
- 启用 两步验证。
- 在 应用专用密码 中生成一个密码,并将其填入此配置中。
5. spring.mail.properties.mail.smtp.auth
spring.mail.properties.mail.smtp.auth=true
- 作用:启用 SMTP 身份验证。
true:表示需要提供用户名和密码进行身份验证。
6. spring.mail.properties.mail.smtp.starttls.enable
spring.mail.properties.mail.smtp.starttls.enable=true
- 作用:启用 STARTTLS 加密。
true:表示使用 STARTTLS 协议加密邮件传输,确保邮件内容在传输过程中是安全的。
QQ邮箱的配置示例
spring.mail.host=smtp.qq.com
spring.mail.port=465
spring.mail.username=your-email@qq.com
spring.mail.password=your-qq-mail-auth-code
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.ssl.enable=true
内存数据库
内存数据库(In-Memory Database)是一种将数据存储在内存中的数据库,与传统的基于磁盘的数据库不同,它的数据完全存储在内存中,因此具有更快的读写速度。
H2 数据库简介
- H2 数据库 是一个轻量级的 Java 内存数据库,常用于开发和测试环境。
- 它可以运行在两种模式下:
- 内存模式(In-Memory Mode):数据存储在内存中,程序关闭后数据会丢失。
- 文件模式(File-Based Mode):数据存储在磁盘文件中,程序关闭后数据仍然保留。
内存数据库的特点
-
数据存储在内存中:
- 数据不会写入磁盘,因此读写速度非常快。
- 适合需要高性能的场景,如缓存或临时数据存储。
-
数据是临时的:
- 数据只在程序运行期间有效,程序关闭后数据会丢失。
- 适合开发和测试环境,不适合生产环境。
-
轻量级:
- 内存数据库通常不需要复杂的配置,启动速度快,占用资源少。
配置中的含义
以下是配置项的详细解释:
1. spring.datasource.url=jdbc:h2:mem:testdb
jdbc:h2:mem:testdb:- 表示使用 H2 数据库的内存模式。
testdb是数据库的名称,可以根据需要修改。
- 内存模式:
- 数据库完全存储在内存中,程序关闭后数据会丢失。
2. spring.datasource.driverClassName=org.h2.Driver
- 指定 H2 数据库的 JDBC 驱动类。
- Spring Boot 会根据这个驱动类自动加载 H2 数据库。
3. spring.datasource.username=sa
- 数据库的用户名,H2 默认用户名是
sa。
4. spring.datasource.password=
- 数据库的密码,H2 默认没有密码,因此这里为空。
5. spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
- 指定 Hibernate 使用 H2 数据库的方言(Dialect)。
- Hibernate 是一个 ORM 框架,方言用于生成与数据库兼容的 SQL 语句。
H2 数据库的优缺点
优点
- 高性能:
- 数据存储在内存中,读写速度比磁盘数据库快得多。
- 易于使用:
- 配置简单,适合快速开发和测试。
- 轻量级:
- 不需要安装额外的软件,直接嵌入到 Java 应用中。
- 内置控制台:
- H2 提供了一个 Web 控制台,可以方便地查看和操作数据库。
缺点
- 数据易丢失:
- 数据存储在内存中,程序关闭后数据会丢失。
- 不适合生产环境:
- 由于数据是临时的,内存数据库通常只用于开发和测试环境。
示例配置
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
package com.qcq.travelpro.controller;
import com.qcq.travelpro.pojo.User;
import com.qcq.travelpro.repository.UserRepository;
import com.qcq.travelpro.service.Impl.IEmailServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequestMapping("/email")
public class emailController {
@Autowired
IEmailServiceImpl IEmailServiceImpl;
@Autowired
UserRepository userRepository;
@GetMapping("/sendCode")
public boolean setCode(String email)
{
IEmailServiceImpl.sendVerificationCode(email);
return true;
}
/*
* 前端传来验证码进行验证,验证成功后注册用户
* */
@PostMapping("/verify-code")
public String verifyCodeAndRegister(@RequestBody Map<String, String> request) {
String username = request.get("username");
String email = request.get("email");
String password = request.get("password");
int verificationCode = Integer.parseInt(request.get("code"));
// 验证验证码
if (!IEmailServiceImpl.verifyCode(email, verificationCode)) {
return "验证码错误或已过期!";
}
// 保存用户信息到数据库
User user = new User();
user.setUsername(username);
user.setEmail(email);
user.setPassword(password);
userRepository.save(user);
// 删除验证码
IEmailServiceImpl.removeCode(email);
return "注册成功!";
}
}
package com.qcq.travelpro.service;
import com.qcq.travelpro.service.Impl.IEmailServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
@Service
public class EmailService implements IEmailServiceImpl {
@Autowired
private JavaMailSender mailSender;
private Map<String, Integer> verificationCodes = new HashMap<>();
public void sendVerificationCode(String email) {
int code = new Random().nextInt(900000) + 100000; // 生成6位随机验证码
verificationCodes.put(email, code);
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("....@..."); // 发件人地址必须与 spring.mail.username 一致
message.setTo(email);
message.setSubject("注册验证码");
message.setText("这里是书舟全球,您的验证码是:" + code + ",请在5分钟内完成验证。若并非您本人操作请忽视。");
mailSender.send(message);
}
public boolean verifyCode(String email, int code) {
return verificationCodes.containsKey(email) && verificationCodes.get(email).equals(code);
}
public void removeCode(String email) {
verificationCodes.remove(email);
}
}
更多推荐


所有评论(0)