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

2016-02-11 12:45:13 +08:00
 CupTools

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

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

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: 'test@something.com',
     from: 'me@jerrychen.me',
     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: 'me@jerrychen.me', name: '' } ],
  to: [ { address: 'test@something.com', 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: 'me@jerrychen.me', args: false },
  envelopeTo: [ { address: 'test@something.com', args: false } ] }

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

3233 次点击
所在节点    问与答
8 条回复
kslr
2016-02-11 13:05:32 +08:00
原生支持 json 的呢, PostgreSQL, MongoDB
CupTools
2016-02-11 13:52:29 +08:00
@kslr 原生支持也要考虑关系。不能直接把 JSON 丢进去

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

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

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

<amp-youtube data-videoid="qKPKsBNw604" layout="responsive" width="480" height="270"></amp-youtube>
RangerWolf
2016-02-12 13:53:45 +08:00
最近大项目我喜欢用 Cassandra
小项目 mysql

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/256074

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX