Можно ли программно «чистить» электронные письма?

У кого-нибудь есть какие-либо предложения относительно того, как я могу очистить тело входящих писем? Я хочу убрать заявления об отказе от ответственности, изображения и, возможно, любой предыдущий текст электронной почты, который также может присутствовать, чтобы у меня остался только основной текст. Я предполагаю, что это не будет возможно никаким надежным способом, но кто-нибудь пробовал это? Существуют ли какие-либо библиотеки, ориентированные на подобные вещи?

14.12.2008 18:44:11
6 ОТВЕТОВ
РЕШЕНИЕ

В электронной почте есть несколько согласованных отметок, которые означают что-то, что вы хотите удалить. Вы можете искать эти строки, используя регулярные выражения . Я сомневаюсь, что вы не можете действительно "санировать" свои электронные письма, но некоторые вещи вы можете искать:

  1. Строка, начинающаяся с «>» (больше, чем пробел), отмечает кавычку
  2. Строка с «-» (два дефиса, затем пробел, затем перевод строки) обозначает начало подписи, см. Блок подписи в Википедии
  3. Составные сообщения, границы начинаются с - помимо этого вам нужно выполнить поиск, чтобы отделить части тела сообщения от нежелательных частей (например, изображений base64)

Что касается фактической реализации C #, я оставляю это для вас или других SO.

4
14.12.2008 19:06:08

Если вы создаете свое собственное приложение, я бы заглянул в Regex, чтобы найти текст и заменить его. Чтобы сделать приложение немного приятнее, я бы создал класс Called Email, и в этом классе у меня есть свойство RAW и свойство Stripped.

Просто несколько советов, вы соберете все остальное, когда посмотрите на регулярные выражения!

0
14.12.2008 18:47:21

Несколько очевидных вещей, на которые стоит обратить внимание:

  1. если почта не является простым текстом, сообщение будет состоять из нескольких частей. Любая часть, тип которой "image / *" (image / jpeg и т. Д.), Вероятно, может быть удалена. По всей вероятности, любая часть, тип которой не является "text / *", может идти.
  2. HTML-сообщение, вероятно, будет иметь часть типа «multipart / alternative» (я думаю) и будет состоять из 2 частей, одной «text / plain» и одной «text / html». Две части должны быть примерно одинаковыми, поэтому вы можете отбросить HTML-часть. Если единственной присутствующей частью является бит HTML, возможно, вам придется выполнить преобразование HTML в обычный текст.
  3. Обычный формат цитируемого текста заключается в том, что перед текстом стоит символ «>». Вы должны иметь возможность отбросить эти строки, если только строка не начинается с «> From», и в этом случае «>» был вставлен, чтобы не дать читателю почты думать, что «From» является началом новой почты.
  4. Сигнатура должна начинаться с "- \ r \ n", хотя есть очень хороший шанс, что завершающий пробел будет отсутствовать.
3
14.12.2008 19:15:56

Версия 3 OSBF-Lua имеет библиотеку синтаксического анализа почты, которая будет обрабатывать MIME, разбивать сообщение на части MIME и так далее. В настоящее время у меня есть куча скриптов Lua, которые делают такие вещи, как игнорирование большинства нетекстовых вложений, предпочитают простой текст HTML и так далее. (Я также заключаю длинные строки в 80 символов, пытаясь сохранить цитаты.)

Что касается удаления ранее цитируемой почты, все приведенные выше предложения хороши (вы должны подписаться на некоторые невоспитанные списки рассылки).

Надежное удаление заявлений об отказе, вероятно, будет трудным. Моим первым шагом было бы просто сохранить библиотеку заявлений об отказе от ответственности, которые будут удалены с конца каждого почтового сообщения; Я написал бы сценарий, чтобы мне было легче добавить его в библиотеку. Для чего-то более сложного я бы попробовал какое-то машинное обучение.

Я работаю над фильтрацией спама с февраля 2007 года и узнал, что все, что связано с электронной почтой, - беспорядок. Хорошее практическое правило заключается в том, что все, что вы хотите сделать, намного сложнее, чем вы думаете :-(

2
14.12.2008 20:49:50

Учитывая ваш вопрос «Можно ли программно« чистить »электронные письма?», Я отвечал «Нет, не надежно».

Опасность, с которой вы сталкиваетесь, на самом деле не технологическая, а социологическая.

Достаточно легко обнаружить и отфильтровать некоторые аспекты сообщений, например изображения. Фильтрация подписей и заявлений об отказе также возможна (хотя это более сложная задача).

Настоящая проблема заключается в том, что это неправильно.

Что произойдет, если ваш фильтр удалит критическую часть сообщения? Можете ли вы отследить его, чтобы найти недостающую часть, или ваша фильтрация деструктивна? Хуже того, вы даже заметили, что кусок пропал?

Есть классический комедийный набросок, который я видел много лет назад, который иллюстрирует эту мысль. Двое парней работают вместе на машине. Один из них выполняет свою работу, другой сидит рядом и читает инструкции из руководства по обслуживанию - ясно, что ни один парень не знает, что он делает, но они делают все возможное.

Парень-мануал читает вслух: «Отмени жирный жир в центре масляного поддона ...» [страница поворота]

Инструментальный парень: «Хорошо, это вышло».

Мануальный парень: «... ни при каких обстоятельствах».

1
14.12.2008 21:08:44
эта мысль пришла мне в голову, и никакой мой процесс не является разрушительным, электронные письма сохраняются в их первоначальном формате, но мне нужно использовать элементы предоставленной информации другими способами, однако то, что вы делаете, это то, что раздражает на меня ..
flesh 15.12.2008 10:37:06

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); 
0
22.11.2019 21:16:56