写点什么

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

  • 2024-06-18
    北京
  • 本文字数:2850 字

    阅读完需:约 9 分钟

功能说明

随着系统的不断庞大,需要我们站在更高的层次,来对系统实现进行重构。例如,发送邮件,在不同的业务、不同的业务节点,会涉及到发送邮件。因此,有必要做一个发送系统邮件的功能,通过暴露公共 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 邮箱里可以看到,会收到一个“系统退信”的邮件。



【附】设计物料:

发布于: 刚刚阅读数: 5
用户头像

✅ 靠谱的程序员写靠谱的代码! 2020-08-17 加入

✅ 知识就是力量,但更重要的,是运用知识的能力。

评论

发布
暂无评论
【程序设计】做一个发送系统邮件的功能,如何设计数据表?_程序设计_靠谱的程序员_InfoQ写作社区