最重要的电子邮件标题分别存储在数据库中

时间:2011-10-25 20:55:24

标签: mysql database email imap

我正在设置一个应用程序来提取我的电子邮件并将其存储在数据库中。至少在目前,我不打算将此应用程序用于实际的电子邮件功能。主要是我想要使用不同的界面,并使用DB后端而不是IMAP感觉更舒服。 (关于电子邮件的新手)。

话虽这么说,在为消息设计我的MySQL表时,包含在不同字段中的关键标题是什么?我认为通常解析单独标头的原因是:

  • 搜索速度
  • 分类,即发件人
  • 减少存储空间,即记住重复的电子邮件或线程,然后丢弃它们

以下是我想要抓住的标题,我的理由是:

  • 自我解释
  • 来自 - 不言自明
  • 交付 - 以确定目标实际上是否为cc
  • X-Mailer - 看看客户的使用情况会很有趣
  • 日期 - 按日期/时间分类
  • 主题 - 不言自明
  • 内容类型 - 选择如何显示
  • Message_ID - 用于跟踪重复项(例如,在从OAuth中提取消息的情况下)

鉴于电子邮件标准,据我所知,非常宽容,而且有些(很多?)电子邮件甚至没有这些标题,我很感激您对哪些标题值得拥有自己领域的建议?或者每个可能的标题都需要一些爱吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

我会考虑使用单独的“标题”表,在电子邮件和标题之间使用1:n关系。

id
mail_id           (ID of the E-Mail record this belongs to)
header_name       (Name of the header, e.g. "Content-type") 
header_content    (Content of the header)
position          (Optionally: The position this header is in in the E-Mail)

这将是更好的设计,并允许您存储无限数量的标头。

答案 1 :(得分:2)

  

要 - 不言自明

自解释?我想不是。它不一定是电子邮件的收件人(由SMTP信封确定)所以请记住,为什么要排除'cc'标题/ bcc信封收件人?虽然'交付'可能表明某些信息,但这里有很多含糊不清的地方。

您存储的数据取决于您需要的数据以及您打算如何处理数据 - 而且您对这两种数据都没有给出很好的解释。

存储所有标头会有多少开销吗?特别是如果将标题定义存储为数据(而不是列名),例如

CREATE TABLE email (
   id INT not null auto-increment,
   body LONGTEXT
   PRIMARY KEY (id)
);
CREATE TABLE header (
   id INT not null auto-increment, 
   /* some headers can occur multiple times, e.g. received from */
   email_id INT,
   header VARCHAR(30),
   value VARCHAR(40)
   PRIMARY KEY (id), INDEX email(email_id, header), INDEX liame(header, email_id)
);

这使您可以灵活地应用黑名单而不仅仅是白名单(即选择您不想记录的标题)。