【程序设计】做一个发送系统邮件的功能,如何设计数据表? 转至元数据结尾

简介: 重构系统邮件发送旨在实现统一的邮件发送功能,通过公共API提供服务。设计包括两个核心数据表:`mail` 表用于存储邮件基本信息,如邮件ID、业务类型、发送者、标题、内容、附件信息、发送状态和时间戳;`mail_receiver` 表记录邮件接收者信息,包括邮件ID、接收者邮箱、接收者类型、发送状态和重试次数。为了优化查询性能,建议创建`Email_Content`表,将`content`和`attach_file`从`Email`表中分离,以减少主表大小。这有助于提高主表的查询速度,并通过定期的数据结转策略,确保热表只存储最近的数据。

功能说明

随着系统的不断庞大,需要我们站在更高的层次,来对系统实现进行重构。例如,发送邮件,在不同的业务、不同的业务节点,会涉及到发送邮件。因此,有必要做一个发送系统邮件的功能,通过暴露公共API实现统一复用。本文只谈数据表结构设计。

通过对发送邮件功能进行分析,我们使用下面的模型:

 

数据用例:

 

 

那么,如何设计数据表呢?

我们来看下面的设计

mail(邮件发送表)
列名 数据类型 说明
id bigint(20) PK,AUTO_INCREMENT
biz_type char(40) 业务操作标识
sender varchar(255) 发件人邮箱
title varchar(500) 邮件标题
content varchar(8192) 邮件内容
attach_file varchar(2048) 附件信息
send_status char(40) 发送状态
send_time datetime 发送时间
create_time datetime 创建时间
update_time datetime 更新时间
mail_receiver(邮件接收人表)
列名 数据类型 说明
id bigint(20) PK,AUTO_INCREMENT
mail_id bigint(20) 关联mail表id
receiver varchar(255) 收件人邮箱
receiver_type varchar(10) 收件人类型:TO 收件人,CC 抄送人
send_status char(40) 发送状态
retry_times int(10) 重试次数
create_time datetime 创建时间

如果考虑到查询性能的话,可以创建一个mail_content表,将 content 和 attach_file 从mail 表中分离出来。另外,该表的数据可以定期做数据结转,保证热表只存近一段时间的数据即可。

mail_content(邮件内容表)
列名 数据类型 说明
id bigint(20) PK,AUTO_INCREMENT
mail_id bigint(20) 关联mail表id
content varchar(8192) 邮件内容
attach_file varchar(2048) 附件信息
create_time datetime 创建时间

 

 

 

 

【附】java 如何校验邮箱是否存在?

AI:在Java中,验证电子邮箱是否存在不是一个简单的任务,因为SMTP服务器通常不会对外公开API来确认邮箱是否存在。然而,你可以尝试发送一封测试邮件来验证邮箱是否存在。如果邮件发送成功,通常意味着邮箱至少是有效的,并且至少在某个时点是存在的。(可以使用JavaMail API发送邮件)

以下是一个使用JavaMail API发送邮件的示例代码,你可以使用这个方法来验证邮箱是否存在:

import javax.mail.*;
import javax.mail.internet.*;
  
public class EmailValidator {
    public static boolean validateEmail(String email) {
        boolean isValid = false;
  
        try {
            final String SMTP_HOST_NAME = "smtp.example.com"; // 替换为你的SMTP服务器
            final String from = "from@example.com"; // 替换为你的邮箱
  
            // 建立Session
            Properties props = new Properties();
            props.put("mail.smtp.host", SMTP_HOST_NAME);
            Session session = Session.getDefaultInstance(props, null);
  
            // 创建邮件
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(email));
            message.setSubject("Email Verification");
            message.setText("This is a test mail");
  
            // 发送邮件
            Transport.send(message);
  
            isValid = true;
        } catch (AddressException ae) {
            ae.printStackTrace();
        } catch (MessagingException me) {
            if (me.getNextException() instanceof SendFailedException) {
                // 邮箱不存在
                isValid = false;
            } else {
                me.printStackTrace();
            }
        }
  
        return isValid;
    }
  
    public static void main(String[] args) {
        String email = "user@example.com"; // 要验证的邮箱
        boolean isValid = validateEmail(email);
        System.out.println("Is email valid? " + isValid);
    }
}

我用我司notice@ss.com向不存在的guozhan.zhang123@ss.com发送邮件,可以通过异常识别出来发送失败,但用它向一个不存在的126邮箱发送,是没有异常提示的。

同样地,我用126邮箱服务给无效的126邮箱发送邮件,可以通过异常识别出来发送失败,但用它向一个不存在的ss.com邮箱发送,是没有异常提示的。不过呢,在126邮箱里可以看到,会收到一个“系统退信”的邮件。

image.png

 

【附】设计物料:

目录
相关文章
|
安全 Java 网络安全
Java 实现 SMTP 协议调用的详细示例及实战指南 SMTP Java 调用示例
本文介绍了如何使用Java调用SMTP协议发送邮件,涵盖SMTP基本概念、JavaMail API配置、代码实现及注意事项,适合Java开发者快速掌握邮件发送功能集成。
1583 0
|
3月前
|
SQL 人工智能 安全
别再让 AI 温柔地夸你的烂代码了:Code Review 提示词该这样写
AI代码审查不能只求“温柔”,而要像资深工程师一样犀利。本文揭示:模糊提示=无效审查,必须用高精度角色锚点(如Google Staff Engineer)、硬性约束(P0-P3风险分级、可运行重构代码)和结构化输出,让AI真正成为生产级审查助手。提示词,已是工程规范新一环。
745 0
别再让 AI 温柔地夸你的烂代码了:Code Review 提示词该这样写
|
12月前
|
人工智能 监控 搜索推荐
给RAG打分:小白也能懂的AI系统评测全攻略
RAG系统评估听起来高深,其实跟我们生活中的'尝鲜评测'没啥两样!本文用轻松幽默的方式,带你从检索质量、生成质量到用户体验,全方位掌握如何科学评测RAG系统,避免踩坑,让你的AI应用又快又准。#RAG技术 #AI评估 #信息检索 #大模型 #数据科学
700 9
|
11月前
|
人工智能 算法 开发者
一个提示词模板,搞定抖音短视频脚本创作
专为技术人打造的抖音脚本提示词模板,结构化拆解短视频创作套路,结合DeepSeek、通义千问等AI工具,快速生成可执行脚本框架,助力技术分享、产品演示高效落地,30秒讲清重点,开头抓人、节奏紧凑、完播率提升。
7289 13
|
存储 人工智能 数据库
视图是什么?为什么要用视图呢?数据库视图:定义、特点与应用
本文三桥君深入探讨数据库视图的概念与应用,从定义特点到实际价值全面解析。视图作为虚拟表具备动态更新、简化查询、数据安全等优势,能实现多角度数据展示并保持数据库重构的灵活性。产品专家三桥君还分析了视图与基表关系、创建维护要点及性能影响,强调视图是提升数据库管理效率的重要工具。三桥君通过系统讲解,帮助读者掌握这一常被忽视却功能强大的数据库特性。
2829 0
|
敏捷开发 人工智能 数据可视化
2025年必备的任务跟踪管理工具深度解析:10款提升团队协作效率的专业平台
任务跟踪管理工具在企业运营中日益重要,尤其在2025年,AI驱动、实时协作、跨平台同步及系统集成成为主要趋势。本文介绍了10款必备工具,如PingCode、Worktile、Trello、Jira等,并分析了其适用场景与功能特点,帮助企业根据团队规模、工作方法论和集成需求选择合适工具,提升协作效率与项目管理水平。
578 3
|
Linux
Linux通过QQ邮箱账号使用mailx发送邮件
Linux通过QQ邮箱账号使用mailx发送邮件
962 2
|
域名解析 Kubernetes 容器
【kubernetes】安装 krew 管理kubectl 插件
【kubernetes】安装 krew 管理kubectl 插件
1023 2
【kubernetes】安装 krew 管理kubectl 插件
IntelliJ IDEA 如何在控制台过滤信息
IntelliJ IDEA 如何在控制台过滤信息
1812 0
|
自然语言处理 Java 程序员
java、八大经典书籍,你看过几本?
java、八大经典书籍,你看过几本?

热门文章

最新文章