[toc]
理论支持所有邮箱。需要邮箱开启IMAP协议。
业务需求
- 文件预处理
- 记录文件的md5及hash值,用于确保文件的唯一性。
- 生成唯一文件密钥(重要,确保文件的安全性。此文件密钥可以保存在邮件附件中)。
- 将文件分割为不大于50M的多个文件包。(可以使用二进制方式分割也可以使用rar打加密包的办法分割,但需要使用上一步中的文件密钥进行文件加密)。
- 文件分配表
- 记录文件属性,文件的分割数,文件的访问地址(邮件地址),文件的下载地址,文件的唯一密钥,访问时间,创建时间,文件类型,上一次访问时间,上一次修改时间。
- 由文件上传,文件下载功能触发记录。
- 定期处理文件的可访问性。(清除上传错误文件)
- 文件上传
- 上传进度跟踪,并汇报错误。
- 文件上传完成后记录到文件分配表中。
- 文件下载
- 从文件分配表中查看信息。
数据存储结构
每一封邮件作为一个单独的文件节点,文件节点中包含路径节点的信息。由所有具有相同协议(MailDisk)的邮件共同构建组成整个文件系统。
文件的访问,维护(删除、更新)则是对指定邮件的操作。
由于邮箱数据保存的特殊性,不支持按字节的文件更新。
'mail': {
'head': {
'subjects': 'MailDisk://path',
'to': (null),
'toOther': (null),
'toNameOther': (null),
'From': emaileAddress,
'FromName': emailAddress
},
'body': {
path: (string),
filename: (string),
fileType: (string),
fileSize: (number|string),
fileMD5: (string),
fileHash: (string),
fileKey: (string),
created_at: (datetime),
updated_at: (datetime),
preview: (base64)
},
attach : [
{ ... }
],
}
文件分配表
用于对邮箱中所有具有MailDisk协议的邮件进行文件索引的创建。
treeNode: {
'nodeType': ('file'|'dir'),
'dirName': (string),
'nextNode': [(nextNodePoint)],
'preNode': (preNodePoint),
'fileNode': {
'fileName': (string),
'filePath': (string),
'fileType': (string),
'fileSize': (number|string),
'fileMD5': (string),
'fileHash': (string),
'fileKey': (string),
'created_time': datetime,
'updated_time': datetime,
'preview': (base64|string),
'downLink': (string)
}
}
例如文件路径:/Root/Document/file.type,对文件路径大小写不敏感。
开发语言选择
网页端:PHP + Angular
客户端:C++ || C#
协议:IMAP + MailDisk。
其他问题
虽然QQ邮箱的最大容量为无限量,但是Q邮箱的可存储邮件数量为500000封(详情),且QQ邮箱的邮件发送总量,每天是有大小限制的,且每一封邮件的大小为50M。
由此,可行性不高。虽然有羊毛可以薅,但是这个薅得并不让人畅快淋漓。