2010-09-21 6 views
6

Я пытаюсь написать приложение, периодически получающее электронные письма. Он пишет каждую почту в базу данных. Но иногда я получаю 'Re:' электронной почты, который выглядит примерно так:Удаление предыдущей части из ответов электронной почты

Новое сообщение

21 сентября 2010 24:26 Кто-то писал (а):

| Старое сообщение |

Формат зависит от поставщика по электронной почте.

Есть ли какая-либо библиотека, которая помогает удалить часть «Re» из сообщения электронной почты? Может быть, IMAP-сервер может это сделать? У меня есть все предыдущие электронные письма из потока в базе данных, поэтому я могу взять их и искать в новом сообщении.

ответ

1

Лично я считаю, что вам не повезло здесь, так как копия сообщения является частью тела. Поэтому, чтобы удалить его, вам придется обработать тело сообщения и написать метод извлечения для каждого известного формата (очевидно, проблема в том, что вы не можете знать все возможные форматы).

Итак, вместо разбора тела, почему бы вам не сохранить все сообщение в базе данных? Обычно размер сообщения не должен быть проблемой с современной СУБД. Если это действительно проблема, вы всегда можете сжать тело и сохранить его в BLOB.

+0

Я не согласен, размер не является ограничением большую часть времени, но нам нужно отображать только сообщение, а не ответы на представление. –

+0

Я согласен с вами в том, что скопированный текст просто беспорядок, однако ему нужно будет сделать компромисс: 1. Разработка фильтра, который когда-либо будет захватывать часть беспорядка и может также удалить соответствующий контент - и, следовательно, быть причиной рисков, скорее всего, окажется дорогостоящим. - или - 2. Жить с беспорядком и доставлять проект с гораздо меньшим риском. - Но, как я уже сказал, это компромисс! – AxelEckenberger

0
  1. Нет IMAP-сервер не будет не так и не удаляет ничего
  2. Такая библиотека не существует, потому что нет стандарта, каждый поставщик услуг электронной почты делает это по-другому, Gmail и т.д. были разработаны свои собственные инструменты
  3. Вы должны ищет шаблон, который будет каким-то образом начать с заголовками с получателем в качестве отправителя, как ...
From: <receipent> 
From: "NAME" <receipent> 
From: receipent 

, и вы должны опустить части из этой строки ниже, howerver только проверка этого будет недостаточной, так как обычно из нее следует объект, cc и т. Д., Поэтому шаблон необходимо проверить. Я думаю, что может существовать какой-то проект с открытым исходным кодом или текстовая библиотека, но его слишком сложно найти в google.

2

Если вы можете связать ответ (RE :) с исходным/предыдущим сообщением о том, что это ответ, тогда я думаю, что вы могли бы захватить основной текст исходного/предыдущего сообщения из вашей базы данных , а затем удалите этот текст из тела ответа. Однако этот метод не будет на 100% точным, так как клиенты могут конвертировать HTML/Rich Text в обычный текст или наоборот. В любом таком случае этот метод, вероятно, не сработает. Тем не менее, этот метод был бы общим и, вероятно, работал большую часть времени.

Кроме того, поставщик электронной почты может добавлять определенные поля заголовка или преамбулы к началу цитируемого сообщения в ответ. В этом случае я не думаю, что есть какое-либо решение «поймать все».

Моя рекомендация будет нацелена на некоторые из действительно огромных поставщиков веб-почты (Gmail, Yahoo, Microsoft и т. Д.), Изучать форматы, которые они используют для своих ответов, и анализировать сообщения соответственно. Кроме того, вы, вероятно, можете обрабатывать несколько общих форматов. Например, символ «>» обычно используется в начале каждой строки цитируемого текста в ответе.

Если вы собираетесь разрабатывать язык, подобный C#, создайте себе интерфейс, такой как IReplyFormat, с соответствующей реализацией для каждого провайдера и, возможно, с некоторыми стандартными форматами.

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

0

Я согласен с Obalix. Слишком сложно отфильтровать ответы, поэтому необходимо сохранить все сообщение. Однако, когда вы отправляете сообщение пользователю, вы можете скрыть некоторые его части. Эта часть может быть показана с опцией «Нажмите здесь, чтобы увидеть полное сообщение» или подобное. Например, регулярное выражение для фильтрации символов «>» будет выглядеть примерно так: @"^[ \f\t\v>]*"

Смежные вопросы