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