V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
CupTools
V2EX  ›  问与答

关于邮件系统的数据库架构

  •  
  •   CupTools · 2016-02-11 12:45:13 +08:00 · 3317 次点击
    这是一个创建于 3214 天前的主题,其中的信息可能已经有所发展或是发生改变。

    doge 又到我重复造轮子的时候了

    我现在(收邮件)的架构是:

    SMTP Receiving

    mailin.io,收取邮件,然后解析成 JSON 。问题是, mailin 现在没有 retry ,也就是说,如果 webhook 挂了,你就收不到邮件了。所以我加了个 Redis 做 Queue ,另一个 Worker 做 webhook submission 。附件的话就直接上传到 S3 ,或者如果你像我一样自己跑 S3 的话,你可以上传到 S3 兼容的对象存储。


    然后问题来了。我收到了邮件,收到了 JSON ,怎么把邮件存在数据库?

    { text: 'This is a test mailing',
      headers: 
       { date: 'Wed, 10 Feb 2016 20:16:22 -0800',
         to: '[email protected]',
         from: '[email protected]',
         subject: 'test Wed, 10 Feb 2016 20:16:22 -0800',
         'x-mailer': 'swaks v20130209.0 jetmore.org/john/code/swaks/',
         'mime-version': '1.0',
         'content-type': 'multipart/mixed; boundary="----=_MIME_BOUNDARY_000_18907"' },
      subject: 'test Wed, 10 Feb 2016 20:16:22 -0800',
      priority: 'normal',
      from: [ { address: '[email protected]', name: '' } ],
      to: [ { address: '[email protected]', name: '' } ],
      date: '2016-02-11T04:16:22.000Z',
      attachments: 
       [ { contentType: 'image/gif',
           fileName: '719.gif',
           contentDisposition: 'attachment',
           transferEncoding: 'base64',
           generatedFileName: '719.gif',
           contentId: 'dca3991c52568b0134a6cb117e1a7330@mailparser',
           checksum: '44859f23af61cacb375df1379051da25',
           length: 7298 } ],
      html: 'This is a test mailing',
      dkim: 'failed',
      spf: 'failed',
      spamScore: 0,
      language: 'english',
      cc: [],
      connection: 
       { id: '267e75b4-0003-40df-acec-59b7c5153bbb',
         remoteAddress: '127.0.0.1',
         clientHostname: '[127.0.0.1]',
         hostNameAppearsAs: 'jerrys-macbook-pro.local',
         envelope: { mailFrom: [Object], rcptTo: [Object] },
         user: false,
         transaction: 1,
         xClient: {},
         xForward: {},
         mailPath: '.tmp/267e75b4-0003-40df-acec-59b7c5153bbb' },
      envelopeFrom: { address: '[email protected]', args: false },
      envelopeTo: [ { address: '[email protected]', args: false } ] }
    

    什么数据库架构了? RDBMS ? NoSQL ?求大家给意见

    8 条回复    2016-02-12 13:53:45 +08:00
    kslr
        1
    kslr  
       2016-02-11 13:05:32 +08:00 via Android
    原生支持 json 的呢, PostgreSQL, MongoDB
    CupTools
        2
    CupTools  
    OP
       2016-02-11 13:52:29 +08:00
    @kslr 原生支持也要考虑关系。不能直接把 JSON 丢进去

    1. 如何快速搜索
    2. 如果减少重复数据
    lhbc
        3
    lhbc  
       2016-02-11 14:32:41 +08:00
    邮件这东西,存文件应该比存数据库好。
    既然解析成 json 了,那直接存 json 多好,最新的 MySQL 也支持 json

    对于支持 json 的数据库,索引、搜索、读取 json 的部分内容,都是没有问题的
    CupTools
        4
    CupTools  
    OP
       2016-02-11 15:25:40 +08:00
    @lhbc mmm.

    如果我想分 inbox , cc , sent 那些之类,该如何解决呢?
    TimePPT
        5
    TimePPT  
       2016-02-11 15:25:53 +08:00 via iPhone
    @lhbc 同意,存文件比存数据库靠谱
    lhbc
        6
    lhbc  
       2016-02-11 16:28:27 +08:00
    @CupTools 数据库记录相关信息即可
    正文丢文件系统
    CupTools
        7
    CupTools  
    OP
       2016-02-11 16:53:07 +08:00
    @lhbc 我在想用 RethinkDB 做后端。

    RangerWolf
        8
    RangerWolf  
       2016-02-12 13:53:45 +08:00
    最近大项目我喜欢用 Cassandra
    小项目 mysql
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2800 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 167ms · UTC 02:31 · PVG 10:31 · LAX 18:31 · JFK 21:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.