本帖最后由 外星人群控 于 2025-1-16 08:20 编辑
之前用iRedmail,后来用宝塔邮局,发现不能很好的控制用户和邮件,特别是宝塔邮局,并发大的情况下,经常延迟达到数秒,甚至直接返回错误,真的很不好控制。不过宝塔邮局的设计思路很清晰,但仅适合用户并发量较小的项目,因为宝塔邮局的数据库用的SQLite,所以打算模仿宝塔邮局思路和数据库,写一套自己的邮箱系统,MySql更适合并发量大项目。目标是100万个邮箱账号,1000并发不崩溃
自建邮箱的目的只是为了方便接受验证码,用来注册账号,绑定邮箱等,不是为了发送邮件广告,所以,后续的设计工作不把发送邮件考虑在内
一步一步来,也算是自我学习的一种方式,先设计好数据库结构,欢迎各位大佬指点一下。
数据库表结构
- 用户表(users)
1. id (INT, PRIMARY KEY, AUTO_INCREMENT)
2. username (VARCHAR)
3. password_hash (VARCHAR)
4. email (VARCHAR, UNIQUE)
5. created_at (TIMESTAMP)
6. updated_at (TIMESTAMP)
- 域名表(domains)
1. id (INT, PRIMARY KEY, AUTO_INCREMENT)
2. domain_name (VARCHAR, UNIQUE)
3. created_at (TIMESTAMP)
4. updated_at (TIMESTAMP)
- 用户域名关联表(user_domains)
1. id (INT, PRIMARY KEY, AUTO_INCREMENT)
2. user_id (INT, FOREIGN KEY REFERENCES users(id))
3. domain_id (INT, FOREIGN KEY REFERENCES domains(id))
4. created_at (TIMESTAMP)
5. updated_at (TIMESTAMP)
- 邮件表(emails)
1. id (INT, PRIMARY KEY, AUTO_INCREMENT)
2. sender_id (INT, FOREIGN KEY REFERENCES users(id))
3. recipient_id (INT, FOREIGN KEY REFERENCES users(id))
4. subject (VARCHAR)
5. body (TEXT)
6. sent_at (TIMESTAMP)
7. received_at (TIMESTAMP)
8. domain_id (INT, FOREIGN KEY REFERENCES domains(id)
- 附件表(attachments)
1. id (INT, PRIMARY KEY, AUTO_INCREMENT)
2. email_id (INT, FOREIGN KEY REFERENCES emails(id))
3. file_path (VARCHAR)
4. file_name (VARCHAR)
5. created_at (TIMESTAMP)
6. updated_at (TIMESTAMP)
引用表关系
1. users 表:存储用户信息。
2. domains 表:存储多个域名信息。
3. user_domains 表:用于关联用户和域名,一个用户可以关联多个域名。
4. emails 表:存储邮件信息,包括发件人、收件人、主题、内容和发送时间等,并与域名相关联。
5. attachments 表:存储邮件附件信息,并与邮件表关联。
设计思路
1. 用户管理:存储用户的基本信息和凭证,确保用户能登录和管理自己的邮箱。
2. 多域名支持:通过域名表和用户域名关联表,管理用户与多个域名之间的关系,确保用户可以在不同的域名下接收邮件。
3. 邮件管理:存储和管理用户发送和接收的邮件信息,包括邮件内容、发送接收时间等。
4. 附件管理:存储邮件的附件信息,确保邮件的完整性和用户可以下载附件。
|