Можно ли программно "чистить" электронные письма?
У кого-нибудь есть какие-либо предложения относительно того, как я могу очистить тело входящих писем? Я хочу удалить заявления об отказе, изображения и, возможно, любой предыдущий текст электронной почты, который также может присутствовать, так что мне остается только текст основного текста. Я предполагаю, что это не будет возможно никаким надежным способом, но кто-нибудь пробовал это? Существуют ли какие-либо библиотеки, ориентированные на подобные вещи?
5 ответов
В электронной почте есть несколько согласованных отметок, которые означают что-то, что вы хотите удалить. Вы можете искать эти строки, используя регулярные выражения. Я сомневаюсь, что вы не можете действительно "санировать" свои электронные письма, но некоторые вещи вы можете искать:
- Строка, начинающаяся с "> " (больше пробела), отмечает кавычку
- Строка с "- " (два дефиса, затем пробел, затем перевод строки) обозначает начало подписи, см. Блок подписи в Википедии
- Составные сообщения, границы начинаются с - помимо этого вам нужно выполнить поиск, чтобы отделить части тела сообщения от нежелательных частей (например, изображений base64)
Что касается фактической реализации C#, я оставляю это для вас или других SO.
Несколько очевидных вещей, на которые стоит обратить внимание:
- если сообщение не является простым текстом, сообщение будет состоять из нескольких частей. Любая часть, тип которой "image/*" (image/jpeg и т. Д.), Вероятно, может быть отброшена. По всей вероятности, любая часть, чей тип не является "text/*", может идти.
- HTML-сообщение, вероятно, будет иметь часть типа "multipart/alternative" (я думаю) и будет состоять из 2 частей, одной "text/plain" и одной "text/html". Две части должны быть примерно одинаковыми, поэтому вы можете отбросить HTML-часть. Если единственной присутствующей частью является бит HTML, возможно, вам придется выполнить преобразование HTML в обычный текст.
- Обычный формат цитируемого текста заключается в том, что перед текстом стоит символ ">". Вы должны иметь возможность отбросить эти строки, если только строка не начинается с ">From", и в этом случае ">" был вставлен, чтобы не дать читателю почты думать, что "From " является началом новой почты.
- Подпись должна начинаться с "- \r\n", хотя есть очень хороший шанс, что пробел будет отсутствовать.
Версия 3 OSBF-Lua имеет библиотеку синтаксического анализа почты, которая будет обрабатывать MIME, разбивать сообщение на части MIME и так далее. В настоящее время у меня есть куча сценариев Lua, которые делают такие вещи, как игнорирование большинства нетекстовых вложений, предпочитают простой текст HTML и так далее. (Я также заключаю длинные строки в 80 символов, пытаясь сохранить цитаты.)
Что касается удаления ранее цитируемой почты, все приведенные выше предложения хороши (вы должны подписаться на некоторые невоспитанные списки рассылки).
Надежное удаление заявлений об отказе от ответственности, вероятно, будет трудным. Моим первым шагом было бы просто сохранить библиотеку заявлений об отказе от ответственности, которые будут удалены с конца каждого почтового сообщения; Я написал бы сценарий, чтобы мне было легче добавить его в библиотеку. Для чего-то более сложного я бы попробовал какое-то машинное обучение.
Я работаю над фильтрацией спама с февраля 2007 года и узнал, что все, что связано с электронной почтой, - это беспорядок. Хорошее практическое правило заключается в том, что все, что вы хотите сделать, гораздо сложнее, чем вы думаете:-(
Учитывая ваш вопрос "Можно ли программно" чистить "электронные письма?", Я отвечал "Нет, не надежно".
Опасность, с которой вы сталкиваетесь, на самом деле не технологическая, а социологическая.
Достаточно легко обнаружить и отфильтровать некоторые аспекты сообщений, например изображения. Фильтрация подписей и заявлений об отказе также возможна (хотя это более сложная задача).
Настоящая проблема заключается в том, что это неправильно.
Что произойдет, если ваш фильтр удалит критическую часть сообщения? Можете ли вы отследить его, чтобы найти недостающую часть, или ваша фильтрация деструктивна? Хуже того, вы даже заметили, что кусок пропал?
Есть классический комедийный набросок, который я видел много лет назад, который иллюстрирует эту мысль. Двое парней работают вместе на машине. Один из них выполняет свою работу, другой сидит рядом и читает инструкции из руководства по обслуживанию - ясно, что ни один парень не знает, что он делает, но они делают все возможное.
Парень-мануал читает вслух: "Отмени жирный жир в центре масляного поддона..." [переворачивает страницу]
Инструментальный парень: "Хорошо, это вышло".
Мануальный парень: "... ни при каких обстоятельствах".
В 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);
Если вы создаете свое собственное приложение, я бы заглянул в Regex, чтобы найти текст и заменить его. Чтобы сделать приложение немного приятнее, я бы создал класс Called Email, и в этом классе у меня есть свойство RAW и свойство Stripped.
Просто несколько советов, вы соберете все остальное, когда посмотрите на регулярные выражения!