邮件服务配置

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
    • Outlooksmtp.office365.com

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。
    • 生成应用专用密码的方法:
      1. 登录 Gmail。
      2. 打开 Google 账户安全设置
      3. 启用 两步验证
      4. 在 应用专用密码 中生成一个密码,并将其填入此配置中。

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 内存数据库,常用于开发和测试环境。
  • 它可以运行在两种模式下:
    1. 内存模式(In-Memory Mode):数据存储在内存中,程序关闭后数据会丢失。
    2. 文件模式(File-Based Mode):数据存储在磁盘文件中,程序关闭后数据仍然保留。

内存数据库的特点

  1. 数据存储在内存中

    • 数据不会写入磁盘,因此读写速度非常快。
    • 适合需要高性能的场景,如缓存或临时数据存储。
  2. 数据是临时的

    • 数据只在程序运行期间有效,程序关闭后数据会丢失。
    • 适合开发和测试环境,不适合生产环境。
  3. 轻量级

    • 内存数据库通常不需要复杂的配置,启动速度快,占用资源少。

配置中的含义

以下是配置项的详细解释:

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 数据库的优缺点

优点
  1. 高性能
    • 数据存储在内存中,读写速度比磁盘数据库快得多。
  2. 易于使用
    • 配置简单,适合快速开发和测试。
  3. 轻量级
    • 不需要安装额外的软件,直接嵌入到 Java 应用中。
  4. 内置控制台
    • H2 提供了一个 Web 控制台,可以方便地查看和操作数据库。
缺点
  1. 数据易丢失
    • 数据存储在内存中,程序关闭后数据会丢失。
  2. 不适合生产环境
    • 由于数据是临时的,内存数据库通常只用于开发和测试环境。

示例配置

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

}

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐