是否有可能以编程方式“清理”电子邮件?

时间:2008-12-14 18:44:11

标签: c# .net email email-processing

有没有人对如何清理收到的电子邮件有任何建议?我想删除免责声明,图像以及可能也存在的任何以前的电子邮件文本,以便我只留下正文文本内容。我的猜测是不可能以任何可靠的方式,但有人试过吗?有没有适合这类事情的图书馆?

6 个答案:

答案 0 :(得分:4)

在电子邮件中,有几个商定的标记意味着你想剥离的东西。您可以使用regular expressions查找这些行。我怀疑你不能很好地“消毒”你的电子邮件,但有些你可以寻找的东西:

  1. 以“>”开头的行(大于空格)标记引号
  2. 带有“ - ”的行(两个连字符,然后是空格,然后换行)标记签名的开头,请参阅Signature block on Wikipedia
  3. 多部分消息,边界以 - 开头,除此之外,您需要进行一些搜索以将消息正文部分与不需要的部分(如base64图像)分开。
  4. 对于实际的C#实现,我将其留给您或其他SO。

答案 1 :(得分:3)

要看一些明显的事情:

  1. 如果邮件不是纯文本,则邮件将是多部分的mime。任何类型为“image / *”(图像/ jpeg等)的部分都可能被删除。在所有可能的情况下,任何类型不是“text / *”的部分都可以。
  2. HTML消息可能会有“multipart / alternative”类型的一部分(我认为),并且将包含2个部分,一个是“text / plain”,另一个是“text / html”。这两个部分应该大致相同,因此您可以删除HTML部分。如果存在的唯一部分是HTML位,则可能必须执行HTML到纯文本转换。
  3. 引用文字的通常格式是在文字之前加上“>”字符。您应该能够删除这些行,除非该行开始“> From”,在这种情况下“>”已插入以防止邮件阅读器认为“发件人”是新邮件的开头。
  4. 签名应以“ - \ r \ n”开头,但很有可能会丢失尾随空格。

答案 2 :(得分:2)

OSBF-Lua的第3版有一个邮件解析库,它将处理MIME并将邮件拆分为其MIME部分,依此类推。我目前有一堆乱七八糟的Lua脚本 像忽略大多数非文本附件的东西,更喜欢纯文本到HTML,等等。 (我还试图保留引用时将长行换行为80个字符。)

至于删除以前引用的邮件,上面的建议都很好(你必须订阅一些不礼貌的邮件列表)。

可靠地删除免责声明可能会很困难。我的第一个裁剪就是维护一个免责声明库,这些免责声明将在每封邮件的末尾被删除;我会编写一个脚本,以便我轻松添加到库中。对于更复杂的东西,我会尝试某种机器学习。

自2007年2月以来,我一直致力于垃圾邮件过滤,并且我已经了解到与电子邮件有关的任何事情都是一团糟。一个好的经验法则是,无论你想做什么都比你想象的要困难得多: - (

答案 3 :(得分:1)

鉴于您的问题“是否有可能以编程方式'清理'电子邮件?”,我会回答“不,不可靠”。

你面临的危险并不是技术性的,而是社会性的。

很容易发现并过滤掉消息的某些方面 - 比如图像。同样,过滤签名和免责声明也是可能的(虽然更多是挑战)。

真正的问题是错误的成本。

如果您的过滤器恰好删除了邮件的关键部分,会发生什么?你可以追溯它找到丢失的部分,或者你的过滤是否具有破坏性?更糟糕的是,你会注意到这件作品丢失了吗?

我多年前看过一部经典的喜剧小品,说明了这一点。一起工作在汽车的两个人。一个是在工作之下,另一个坐在附近阅读服务手册的说明 - 很明显,没有人知道他在做什么,但他们正在尽力而为。

手动的家伙,大声朗读:“撤消油底壳中心的粗体......”[翻页]

工具人:“好的,它出来了。”

手动人:“......在任何情况下都没有。”

答案 4 :(得分:0)

SigParser具有一个可在.NET中使用的程序集。它为您提供HTML和文本形式的正文,其余内容均已删除。如果您给它发送HTML电子邮件,则在需要时会将电子邮件转换为文本。

var parser = new SigParser.EmailParsing.EmailParser();
var result = await parser.GetCleanedBodyAsync(new SigParser.EmailParsing.Models.CleanedBodyInput {
    FromEmailAddress = "john.smith@example.com",
    FromName = "John Smith",
    TextBody = @"Hi Mark,
This is my message.

Thanks
John Smith
888-333-4434"
            });

// This would print "Hi Mark,\r\nThis is my message."
Console.WriteLine(result.CleanedBodyPlain); 

答案 5 :(得分:0)

如果您创建自己的应用程序,我会查看Regex,查找文本并替换它。为了使应用程序有点好,我创建了一个叫Called的类,在那个类中我有一个名为RAW的属性和一个名为Stripped的属性。

只是一些提示,当你看到正则表达式时,你会收集其余的东西!