парсинг почтового текста отвечает/передает

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

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

То, что я задавался вопросом, является этим, если существует своего рода стандартизованный способ, для устранения неоднозначности этого процесса?

Спасибо - Theo

13
задан Theofanis Pantelides 11 March 2010 в 11:11
поделиться

4 ответа

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

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

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

2
ответ дан 2 December 2019 в 01:41
поделиться

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

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

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

  • Обычный текст, «форматированный текст», HTML у всех будет другой способ отделения ответа от оригинала
  • В Outlook я могу выбрать один из следующих вариантов при ответе на сообщение:
    • Не включать
    • Прикрепить исходное сообщение
    • Включить текст исходного сообщения
    • Включить и сделать отступ в исходном тексте сообщения
    • Префикс каждой строки исходного сообщения
  • Вдобавок ко всему, я часто отправляю и получаю ответы, в которых указано «Ответы в строке» "где мои комментарии перемешаны с исходным сообщением, поэтому исходное сообщение больше не существует в исходной форме.
2
ответ дан 2 December 2019 в 01:41
поделиться

Я подумал:

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;
}
3
ответ дан 2 December 2019 в 01:41
поделиться

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

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

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

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

1
ответ дан 2 December 2019 в 01:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: