[toc]

理论支持所有邮箱。需要邮箱开启IMAP协议。

业务需求

  1. 文件预处理
    • 记录文件的md5及hash值,用于确保文件的唯一性。
    • 生成唯一文件密钥(重要,确保文件的安全性。此文件密钥可以保存在邮件附件中)。
    • 将文件分割为不大于50M的多个文件包。(可以使用二进制方式分割也可以使用rar打加密包的办法分割,但需要使用上一步中的文件密钥进行文件加密)。
  2. 文件分配表
    • 记录文件属性,文件的分割数,文件的访问地址(邮件地址),文件的下载地址,文件的唯一密钥,访问时间,创建时间,文件类型,上一次访问时间,上一次修改时间。
    • 由文件上传,文件下载功能触发记录。
    • 定期处理文件的可访问性。(清除上传错误文件)
  3. 文件上传
    • 上传进度跟踪,并汇报错误。
    • 文件上传完成后记录到文件分配表中。
  4. 文件下载
    • 从文件分配表中查看信息。

数据存储结构

每一封邮件作为一个单独的文件节点,文件节点中包含路径节点的信息。由所有具有相同协议(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。

由此,可行性不高。虽然有羊毛可以薅,但是这个薅得并不让人畅快淋漓。