我正在开发一个应用程序,它将查找电子邮件收件箱并将特定电子邮件作为其功能的一部分保存。发生的情况是建立 imap 连接,然后检索所有设置为 UNSEEN 的电子邮件。每封电子邮件都会根据预定义的条件进行检查,如果满足,则将其保存到数据库中。这些条件可以由用户设置,可以是:
主题
- 包含字符串
- 不包含字符串
身体
- 包含字符串
- 不包含字符串
从
- 具体地址
条件可以“链接”,例如:
FILTER WHERE
Subject CONTAINS "Order Confirmation"
AND
Email FROM "billyjones26@gmail.com" OR "billyjones26@googlemail.com"
我在思考如何格式化和存储这些条件时遇到了麻烦。我需要有一个 GUI,用户可以在其中创建这些条件。
我的问题是我应该如何存储这些条件?即某种数据库表结构,或者可能转换为字符串格式并存储在单个表中。不限数量的用户需要有不限数量的条件,我需要知道有哪些运营商等等。
希望这是足够的信息!
* 为迈克尔编辑 *
所以我可以创造条件并保存它们。现在我正在检索它们并尝试匹配电子邮件。我创建了一个具有一个条件的过滤器:主题包含“测试”。只有一封电子邮件应该与此匹配,但不知何故,所有电子邮件都被添加到匹配的数组中。
我的控制器正在获取电子邮件/条件:
public function check_email(){
$filters = $this->filters_model->get_filters($owner_id=1);
foreach($filters->result() as $filter){
$emails = $this->gmail->get_emails($mailbox_id = $filter->mailbox_id, $limit = 10);
$matched = array();
$conditions = unserialize($filter->conditions);
foreach($emails as $email){
if($conditions->isMet($email) == TRUE){
$matched[] = $email;
}
}
echo count($matched);
echo '<pre>'.$filter->title.'<br /.';
print_r($conditions);
echo '</pre><br />-----';
exit;
}
}
键值先决条件.php
这似乎可以正常工作,因为 var_dumpstripos($subject, $this->value) !== FALSE;
仅对 1 封电子邮件显示 TRUE。
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Keyvalueprerequisite {
private $key;
private $comparator;
private $value;
public function __construct($key, $comparator, $value){
$this->key = $key;
$this->comparator = $comparator;
$this->value = $value;
}
public function isMet(&$context)
{
switch ($this->key) {
case "subject":
$subject = $context["subject"];
if ($this->comparator === "in"){
return stripos($subject, $this->value) !== FALSE;
} else if ($this->comparator === "!in") {
return stripos($subject, $this->value) === FALSE;
}
return FALSE;
break;
case "body":
$body = $context["body"];
if ($this->comparator === "in") {
return stripos($body, $this->value) !== FALSE;
} else if ($this->comparator === "!in") {
return stripos($body, $this->value) === FALSE;
}
return FALSE;
break;
case "from_address":
$from = $context["from"];
if ($this->comparator === "=") {
return $this->value === $from;
} else if ($this->comparator === "!=") {
return $this->value !== $from;
} else{
return false;
}
break;
default:
}
return FALSE;
}
}
先决条件组.php
有些东西可能不太写在这里。var_dump 对$result = $result && $is_met
10 封电子邮件中的每封都返回 true。
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Prerequisitegroup {
private $type;
private $prerequisites;
public function __construct($type = 'AND'){
$this->type = $type;
}
public function add(){
foreach(func_get_args() as $prerequisite){
$this->prerequisites[] = $prerequisite;
}
}
public function isMet(&$context)
{
if (empty($this->prerequisites) === FALSE) {
$result = TRUE;
foreach ($this->prerequisites as $prerequisite) {
$is_met = $prerequisite->isMet($context);
if ($this->type === 'AND') {
$result = $result && $is_met;
if ($result === FALSE) {
return FALSE;
}
} else {
$result = $result || $is_met;
if ($result === TRUE) {
return TRUE;
}
}
}
return $result;
}
return TRUE;
}
}
这些是我正在检查的条件:
string(3) "AND"
["prerequisites":"Prerequisitegroup":private]=>
array(1) {
[0]=>
object(Prerequisitegroup)#23 (2) {
["type":"Prerequisitegroup":private]=>
string(2) "OR"
["prerequisites":"Prerequisitegroup":private]=>
array(1) {
[0]=>
object(Keyvalueprerequisite)#24 (3) {
["key":"Keyvalueprerequisite":private]=>
string(7) "subject"
["comparator":"Keyvalueprerequisite":private]=>
string(2) "in"
["value":"Keyvalueprerequisite":private]=>
string(4) "TEST"
}
}
}
}
}