Я создаю веб-почтовый клиент с помощью c# asp.net.
То, что сбивает с толку, - то, что различные почтовые клиенты, кажется, добавляют оригинальный текст большим количеством различных способов при ответе по электронной почте.
То, что я задавался вопросом, является этим, если существует своего рода стандартизованный способ, для устранения неоднозначности этого процесса?
Спасибо - Theo
Стандартизованного способа не существует, но разумная эвристика поможет вам найти хорошее расстояние.
Некоторые алгоритмы классифицируют строки на основе их начального символа (ов) и путем сравнения текста с корпусом размеченного текста, что дает статистическую вероятность для каждой строки, что это а) часть того же блока, что и следующий / предыдущий и б) цитируемый текст, подпись, новый текст и т. д.
Стоит попробовать некоторые из самых популярных почтовых клиентов , а также создать и сравнить несколько примеров сообщений чтобы увидеть, в чем разница. Группы новостей Usenet также могут помочь вам создать разумный корпус сообщений для работы. Электронная почта в формате HTML, конечно же, добавляет дополнительный уровень сложности, хотя большинство совместимых почтовых клиентов также включают соответствующий простой текст. Различные языки также вызывают проблемы, так как клиенты, которые могут разобрать «Павел написал:», могут упасть на «Pablo ha scritto:».
Не совсем, нет.
В исходном RFC для Интернет-сообщений говорится о заголовке in-reply-to
, но не указывается формат тела сообщения.
Как вы обнаружили, разные клиенты добавляют исходный текст по-разному, подразумевая, что нет стандарта, а также тот факт, что пользователи будут делать что-то по-разному:
Я подумал:
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;
}
Вот некоторые эвристики, которые вы можете попробовать:
-Любое количество> символов - Ищете "написал:" (будьте очень осторожны с this one)
Также вы можете попробовать связать поле Message ID с полем In Reply To
И, наконец, если вы не можете найти подходящую библиотеку для этого, пора начать этот проект. Больше никакого синтаксического анализа писем способом Ктулху :)