在 Thunderbird 中,可以选择匹配以下所有或者符合以下任意一项给定一组过滤规则。没有办法混合或者和和逻辑运算符可以自由创建更复杂的条件,如 ((A AND B) OR (C AND D)) AND E。
是否有插件可以实现上述功能?
答案1
我需要过滤来自同一个人的大量不同主题,所以我的解决方案是这样的:
- 添加了过滤器以匹配以下任何内容,并添加了我想要的任何主题。
- 我设置它执行的操作是将优先级设置为最低。
- 然后我添加了一个新的过滤器来匹配以下所有内容:优先级最低,并且包含(我想要过滤的电子邮件地址)。
- 我设置的动作是移动到某个文件夹。
您需要确保的一件事是,第一个文件在列表中的位置较高,因此它会首先执行。我知道这不是最优雅的解决方案,但它可以扩展以满足您的需求。
答案2
我似乎找不到一个好的扩展来做到这一点,但如果你只是在单个文件夹中搜索,快速搜索工具栏也能发挥同样的作用。
例如 - 如果我想为来自 Tommy 和 Billy 的所有消息(但不包括主题中带有 Fwd 的消息)以及来自 Sandra 的消息(包括转发)创建条件,我会设置搜索(使用快速搜索工具栏并将其设置为按表达式搜索):
((发件人:Tommy 或 发件人:Billy) AND -subject:Fwd) 或 (发件人:Sandra)
然而,如果有多个文件夹,这是不可能的。
J
答案3
使用 FiltaQuilla 和一些 javascript 操作/规则,这是可行的。但是,这里是一个对 FiltaQuilla 源代码进行了一些修改的示例,以简化流程。
此处的示例将执行三个阶段的过滤:标记 - 仅对电子邮件进行分类。然后,修改 - 进行一些逻辑计算并修改电子邮件主题或标题。以及操作 - 执行实际操作。每个阶段通常都涉及在 Thunderbird 过滤器对话框中编辑过滤器,但 FiltaQuilla 添加了选项。第 1 阶段和第 2 阶段将其结果保存在新添加的电子邮件标题字段中,第 2 阶段和第 3 阶段使用该字段中的结果在执行正常操作之前执行一些逻辑。
脚步:
安装 FiltaQuilla
看来很多功能只能在 Thunderbird 3.1 上使用。因此请先升级到 TB 3.1。然后安装 FiltaQuilla。
在 FiltaQuilla 首选项选项卡中,启用“后缀到主题”和“Javascript 操作”。
修改 FiltaQuilla 源
编辑 ”[电子邮件保护]/content/filtaquilla.js” 位于扩展目录中,如下所示:
// Suffix to subject
self.subjectSuffix =
{
...
apply: function(aMsgHdrs, aActionValue, aListener, aType, aMsgWindow)
{
for (var i = 0; i < aMsgHdrs.length; i++)
{
var msgHdr = aMsgHdrs.queryElementAt(i, Ci.nsIMsgDBHdr);
////var appSubject = _mimeAppend(aActionValue, msgHdr.subject, false);
////msgHdr.subject = appSubject;
var headerName = "mykeywords";
var headerValue = msgHdr.getStringProperty(headerName);
msgHdr.setStringProperty(headerName, headerValue + " " + aActionValue);
headerValue = msgHdr.getStringProperty(headerName);
// Cu.reportError("chg : " + headerName + " : " + headerValue);
}
},
代码将原先的“后缀到主题”操作改为,将添加后缀的字符串添加到名为“mykeywords”的新报头中,该新报头字段将用于以字符串单词的形式保存前两阶段过滤的结果。
此源代码更改是为了重用“后缀”操作,因为通常给主题添加后缀并不是很有用。因此,重用其内部核心不会对 FiltaQuilla 的可用性产生很大影响。如果不这样做,应向 FiltaQuilla 创建者发布官方功能请求以添加您想要的功能,或者您需要在过滤条件中编写更多 Javascript 代码作为 Javasctipt 条件。
创建标记过滤规则
例如,创建一系列规则,每个规则只有一个操作:“后缀到主题”,但后缀词将分别标识其得到的结果。例如,根据电子邮件的来源对电子邮件进行分类,方法是在后缀词“company-A”、“company-B”等。请记住,这些词“company-A”、“company-B”等将连接到“mykeywords”标题字段中。
将这些规则放在过滤规则列表的开头。
创建逻辑修改的过滤规则
在过滤规则标题字段下拉框中,使用“自定义”将“我的关键词”添加到列表中。然后在过滤对话框中选择“我的关键词包含公司-”作为条件。
在操作部分中选择“Javascript 操作”。添加一些代码,如下所示:
for (let index = 0; index < msgHdrs.length; index++)
{
let hdr = msgHdrs.queryElementAt(index, Ci.nsIMsgDBHdr);
let s = hdr.getStringProperty("mykeywords");
let v = s.split("company-"); /* result words are in v[] now */
let r = ""; /* logic conversion result */
let cnt = 0;
if ( v != undefined && v.length != undefined && v.length > 0) {
let lastVN = 0;
for(var i=v.length -1; i>=0; i--) {
let ss = v[i];
if ( ss.length > 1 ) {
ss = ss.substring(0);
/* convert company A into VIP, B into NORMAL, C into IGNORE.
* Assume the marking section starts with A,B, then C thus
* C gets parsed first, then A and B.
*/
if (ss.search(/A/) == 0) { ss = "V"; lastVN = 1; } /*VIP*/
else if (ss.search(/B/) == 0 ) { ss = "N"; lastVN = 1; } /*NORMAL*/
else if (ss.search(/C/) == 0 ) { ss = "IGNORE"; }
/* prepend subject line */
if ( cnt == 0 ) { r = ss + "] ";
} else { if (lastVN == 0) r = ss + " " + r; else r = ss + r; }
cnt ++;
}
} /* for(var i=v.length -1; */
if ( cnt > 0 ) { r = "[" + r; }
} /* if ( v != undefined && */
hdr.subject = r + hdr.subject;
} /* for (let index = 0; */
此时,脚本可以从“mykeywords”标头字段访问所有标记结果。只需解析字符串,然后可以在解析后应用任何逻辑来实现您想要的逻辑结果。例如,您可以应用 if “A” and “B”,将“result-AB”添加到“mykeywords”等。然后在下一个阶段检查“mykeywords 包含 result-AB”是否真正代表“A and B”。
上面的例子还表明,可以在主题行前面添加“[VN IGNORE]”,以指示主题电子邮件涉及三家公司中的哪一家。
创建操作过滤规则
现在根据“mykeywords”中包含的值创建操作规则。这只是常规设置。
笔记:
FiltaQuilla 在条件部分支持 javascript。因此,如果您不想更改扩展源代码,则需要在过滤器对话框的条件部分编写更多代码。使用该代码也可以进行任何逻辑计算。
请访问 FiltaQuilla 网站以获取更多信息。
答案4
这是一个突出的错误https://bugzilla.mozilla.org/show_bug.cgi?id=297852。
您需要msgFilterRules.dat
在配置文件文件夹下的邮件帐户中进行编辑(请参阅菜单“帮助”>“疑难解答信息”)。POP3 帐户位于下方,(profile folder)/Mail
而 IMAP 帐户位于下方(profile folder)/ImapMail
。这是 IMAP 帐户过滤器的一个示例:
name="HRstuff"
enabled="yes"
type="17"
action="Move to folder"
actionValue="imap://syockit%[email protected]/INBOX/HR"
condition="AND (subject,contains,HR) AND (all addresses,contains,[email protected])"
在此示例中,过滤器是使用“匹配以下所有内容”条件创建的。条件格式相当笨拙,因为第一个操作数也以布尔运算符作为前缀,AND (A) AND (B)
而不是更直观的(A) AND (B)
。
现在,要创建嵌套条件,例如(A||C)&&(B||D)
,按如下方式编写
AND (OR (A) OR (C)) AND (OR (B) OR (D))
修改条件并保存后msgFilterRules.dat
,我建议不要在 Thunderbird 中编辑此高级过滤器,以免其损坏。不过,您可以编辑其他简单过滤器。务必备份msgFilterRules.dat
!
我使用的是 Thunderbird 115.6.1,到目前为止似乎可以正常工作。我还没有尝试过嵌套深度超过 2 层。