Получить фактическое сообщение электронной почты, которое только что написал человек, исключая любой цитируемый текст - PullRequest
17 голосов
/ 02 ноября 2011

На сайте есть два ранее существующих вопроса.Один для Python, другой для Java.

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

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

У меня также есть возможность, если это поможет вставить какой-либо тег <*****RESPOND ABOVE HERE*******> при необходимости в электронные письма, что означает, что я могу отменить все ниже.

Что бы вы посоветовали мне сделать?Всегда добавлять этот тег в копию HTML и копию в текстовом виде, а затем захватить все, что находится над ним?

Я бы тогда остался со сценарием, чтобы узнать, как каждый почтовый клиент создает ответ.Потому что, например, Gmail будет делать это:

On Wed, Nov 2, 2011 at 10:34 AM, Message Platform <35227817-7cfa-46af-a190-390fa8d64a23@dev.example.com> wrote:
## In replies all text above this line is added to your message conversation ##

Любые предложения или рекомендации передового опыта?

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

Или я должен просто всегда удалять предыдущую строку, если она содержит дату? .. и т. Д.

Ответы [ 7 ]

21 голосов
/ 27 сентября 2012

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

Интересно, что даже у инженеров Facebook возникли проблемы с этой проблемой, а у Google есть патент на метод "Обнаружения цитируемого текста".

Существует три решения, которые могут оказаться приемлемыми:

Оставьте это в покое

Первое решение - просто оставить все в сообщении.Большинство почтовых клиентов делают это, и никто, кажется, не жалуется.Конечно, онлайновые системы сообщений (такие как «Сообщения» в Facebook) выглядят довольно странно, если у них есть ответы начального типа.Один хитрый способ заставить эту работу работать нормально - это сделать сообщение со свернутыми в кавычки строками и добавить небольшую ссылку для «раскрытия цитируемого текста».

Отделение ответа от более старого сообщения

Второе решение, как вы упомянули, состоит в том, чтобы поместить разграничивающее сообщение вверху ваших сообщений, например --------- please reply above this line ----------, а затем убрать эту строку и все, что ниже, при обработке ответов.Многие системы делают это, и это не самая плохая вещь в мире ... но это делает вашу электронную почту более «автоматизированной» и менее личной (на мой взгляд).

Извлечение цитируемого текста

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

$clean_text = preg_replace('/(^\w.+:\n)?(^>.*(\n|$))+/mi', '', $message_body);

Существуют некоторые проблемы при использовании этого более простого метода:

  • Многие почтовые клиенты также позволяют людям цитировать более ранние электронные письма.и также добавьте в эти строки кавычек >, так что вы будете отбирать кавычки.
  • Обычно над цитируемым письмом есть строка с чем-то вроде On [date], [person] said.Эту строку трудно удалить, поскольку она не отформатирована одинаково для разных почтовых клиентов и может быть на одну или две строки выше удаленного цитируемого текста.Я реализовал этот метод обнаружения с небольшим успехом в моей библиотеке PHP Imap .

Конечно, тестирование является ключевым, и компромиссы могут стоить того для вашего конкретногосистема.YMMV.

11 голосов
/ 02 января 2018

Существует множество библиотек, которые могут помочь вам извлечь ответ / подпись из сообщения:

Я также читал, что MailGun предлагает услугу для анализа входящей электронной почты и отправки ее содержимого на URL-адрес по вашему выбору. Он автоматически удалит цитируемый текст из ваших писем: http://blog.mailgun.com/handle-incoming-emails-like-a-pro-mailgun-api-2-0/

Надеюсь, это поможет!

2 голосов
/ 26 мая 2014

Возможно, полезно: quotequail - это библиотека Python, которая помогает идентифицировать цитируемый текст в электронных письмах

1 голос
/ 02 ноября 2011

Afaik, (стандартные) электронные письма должны цитировать весь текст, добавляя ">" перед каждой строкой.Который вы можете удалить, используя strstr ().В противном случае, вы пытались перенести этот пример Java на php?Это не что иное, как Regex.

Даже такие страницы, как Github и Facebook, имеют эту проблему.

0 голосов
/ 06 мая 2016

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

$filteringMessage = preg_replace('/.*\n\n((^>+\s{1}.*$)+\n?)+/mi', '', $message);

Тест https://regex101.com/r/xO8nI1/2

0 голосов
/ 11 июля 2014

https://mailgun.com предлагает извлечение ответа (удаление цитируемого содержимого), а также извлечение подписи в виде облачного сер. Я еще не проверял, но выглядит многообещающе.

0 голосов
/ 02 ноября 2011

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

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

...