синтаксический анализ текста ответа - PullRequest
13 голосов
/ 11 марта 2010

Я создаю почтовый веб-клиент, используя c # asp.net.

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

Что мне было интересно, так это то, что, если есть какой-то стандартизированный способ, устранить неоднозначность этого процесса?

Спасибо -Theo

Ответы [ 4 ]

3 голосов
/ 22 марта 2010

Я думал:

public String cleanMsgBody(String oBody, out Boolean isReply) 
{
    isReply = false;

    Regex rx1 = new Regex("\n-----");
    Regex rx2 = new Regex("\n([^\n]+):([ \t\r\n\v\f]+)>");
    Regex rx3 = new Regex("([0-9]+)/([0-9]+)/([0-9]+)([^\n]+)<([^\n]+)>");

    String txtBody = oBody;

    while (txtBody.Contains("\n\n")) txtBody = txtBody.Replace("\n\n", "\n");
    while (new Regex("\n ").IsMatch(txtBody)) txtBody = (new Regex("\n ")).Replace(txtBody, "\n");
    while (txtBody.Contains("  ")) txtBody = txtBody.Replace("  ", " ");

    if (isReply = (isReply || rx1.IsMatch(txtBody)))
        txtBody = rx1.Split(txtBody)[0]; // Maybe a loop through would be better
    if (isReply = (isReply || rx2.IsMatch(txtBody)))
        txtBody = rx2.Split(txtBody)[0]; // Maybe a loop through would be better
    if (isReply = (isReply || rx3.IsMatch(txtBody))) 
        txtBody = rx3.Split(txtBody)[0]; // Maybe a loop through would be better

    return txtBody;
}
2 голосов
/ 20 марта 2010

Нет стандартизированного способа, но разумная эвристика даст вам хорошее расстояние.

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

Стоит попробовать некоторые из самых популярных почтовых клиентов и создать и сравнить некоторые примеры сообщений, чтобы увидеть, в чем различия. Группы новостей Usenet также могут помочь вам создать разумный набор сообщений для работы. Конечно, электронная почта в формате HTML добавляет дополнительный уровень сложности, хотя большинство совместимых почтовых клиентов также включают соответствующий простой текст. Различные языки также вызывают проблемы, так как клиенты, которые могут анализировать "Paul писал:", могут упасть на "Pablo ha scritto:".

2 голосов
/ 15 марта 2010

Не совсем, нет.

Оригинальный RFC для интернет-сообщения говорит о заголовке in-reply-to, но не указывает формат тела.

Как вы обнаружили, разные клиенты добавляют исходный текст по-разному, подразумевая, что не существует стандарта, в сочетании с тем, что пользователи будут также действовать по-разному:

  • Обычный текст, «расширенный текст», HTML все будет по-разному отделять ответ от оригинала
  • В Outlook я могу выбрать один из следующих вариантов ответа на сообщение:
    • Не включать
    • Прикрепить оригинальное сообщение
    • Включить исходный текст сообщения
    • Включите и сделайте отступ текста оригинального сообщения
    • Префикс каждой строки исходного сообщения
  • Кроме того, я часто отправляю и получаю ответы с указанием «Встроенные ответы», где мои комментарии смешиваются с исходным сообщением, поэтому в любом случае исходное сообщение больше не существует в своем первоначальном виде.
1 голос
/ 21 марта 2010

Некоторые эвристики, которые вы можете попробовать:

- любое количество символов> Ищите «писал:» (будьте очень осторожны с этим)

Также вы можете попробовать связать поле ID сообщения с полем In Reply To

И, наконец, если вы не можете найти хорошую библиотеку для этого, пришло время начать этот проект. Больше не нужно разбирать электронные письма способом Ктулху:)

...