从一系列设置模板中解析传入的电子邮件内容

时间:2012-11-18 07:31:01

标签: php regex parsing email

处理需要解析传入电子邮件的项目,并提取某些信息并将其存储在数据库中。我们正在使用postmarkapp来提取电子邮件的正文内容,所以我们只有文本的内容,但我现在有点坚持如何以最有效的方式解析电子邮件。

随着时间的推移,我们将添加更多“接受”的传入邮件格式,但首先我们可能会收到4封常见的电子邮件,也就是说,它们会遵循相同的格式和信息。想要提取(联系方式,id,链接,生物)将在同一个地方,(每种支持的格式)。

我认为我们将拥有一个可以处理常见任务的界面,每个支持的格式都会实现这一点,但是如何获取这些信息就是我被困住的地方。

开放任何有关不同方法/技术的想法和想法,最好是PHP,但如果我们需要使用其他东西,那很好。

2 个答案:

答案 0 :(得分:2)

我开发的网站上有类似的功能。我们的用户通过定价从供应商处收到电子邮件。他们将电子邮件的正文复制并粘贴到我们网站上的textarea中,然后单击按钮。然后我们解析文本以查找产品和价格,并将信息粘贴到数据库中。

要进行解析,我们首先必须确定供应商,就像您需要确定使用哪个模板一样。我们会在文本中查找某些字符串 - 通常是供应商的名称,或者是电子邮件中唯一的一行。我们在一个名为getParserForText()之类的方法中这样做。该方法返回一个Parser对象,该对象使用parseText()方法实现一个简单的接口。

每种格式都有一个Parser实现类。每个类中的parseText()方法负责从文本中获取数据。我们寻找制作这些优雅和通用的方法,并且根本没有找到一个非常好的方法来做到这一点。我们使用正则表达式的组合,将字符串拆分成更小的部分,然后遍历字符串。

伪代码:

$text = $_POST['emailBody'];
$parser = getParserForText($text);
$result = $parser->parseText($text);
if(count($result["errors"]) > 0)
{
    // handle errors
}
else
{
    saveToDatabase($result["prices"]);
}

我们无法控制供应商使用的格式,因此我们不得不求助于:

  1. 将文本拆分为每行左右的字符串数组,并带有日期(prey_split())

  2. 对于该数组中的每个元素,第一行包含日期,接下来的三到六行包含产品和价格

  3. 将日期拉出,然后将字符串拆分为新行

  4. 每行
  5. ,使用正则表达式查找价格($ 000.0000)并将其拉出来

  6. 修剪该行的其余部分以用作产品名称

  7. 我们使用了大量prey_split()preg_match_all()explode()。虽然在我看来并不特别优雅或通用,但该系统非常强大。通过在正则表达式中留下一点摆动空间,我们通过一些小格式更改使其无需更改代码。通过“摆动空间”我的意思是:不要搜索空格,搜索任何空格。不要搜索美元符号和两个数字,搜索美元符号和任意数量的数字。像这样的小事。

    编辑:

    这是几年前我问过的一个问题: Algorithms or Patterns for reading text

答案 1 :(得分:0)

由于它是生成的电子邮件,它很可能是一种易于解析的格式,例如每条指令一行; key=value。然后,您可以在第一个= - 符号上拆分行,并使用它为您提供的键值对。

当您无法控制传入的数据格式时,正则表达式很有用,但是当您这样做时,更容易确保它在没有正则表达式的情况下可以解析。

如果格式对于这种简单的解析而言过于复杂,请使用该格式给出一个文件示例,这样我就可以使答案更具体。同样的事情,如果这不是你要问的问题的答案:请举例说明你想要的那种答案。