【程序设计】做一个发送系统邮件的功能,如何设计数据表?
功能说明
随着系统的不断庞大,需要我们站在更高的层次,来对系统实现进行重构。例如,发送邮件,在不同的业务、不同的业务节点,会涉及到发送邮件。因此,有必要做一个发送系统邮件的功能,通过暴露公共 API 实现复用。本文只谈数据表结构设计。
通过对发送邮件功能进行分析,我们使用下面的模型:
![](https://static001.geekbang.org/infoq/11/1133d8dffc171f61ccbef38e48b594f4.png)
数据用例:
![](https://static001.geekbang.org/infoq/20/20c81273887429af9ef217c342f779b3.png)
那么,如何设计数据表呢?
我们来看下面的设计
表名: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 发送邮件的示例代码,你可以使用这个方法来验证邮箱是否存在:
我用我司 notice@ss.com 向不存在的 guozhan.zhang123@ss.com 发送邮件,可以通过异常识别出来发送失败,但用它向一个不存在的 126 邮箱发送,是没有异常提示的。
同样地,我用 126 邮箱服务给无效的 126 邮箱发送邮件,可以通过异常识别出来发送失败,但用它向一个不存在的 ss.com 邮箱发送,是没有异常提示的。不过呢,在 126 邮箱里可以看到,会收到一个“系统退信”的邮件。
![](https://static001.geekbang.org/infoq/04/044106509ee37c1ee16947b885a2caa6.png)
【附】设计物料:
版权声明: 本文为 InfoQ 作者【靠谱的程序员】的原创文章。
原文链接:【http://xie.infoq.cn/article/edeb295202fa4e7c7fc9b4009】。未经作者许可,禁止转载。
评论