Получите фактическое сообщение электронной почты, которое только что написал человек, за исключением любого цитируемого текста

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

  • Java Как удалить цитированный текст из электронной почты и показать только новый текст
  • Python Надежный способ получить только текст электронной почты, за исключением предыдущих писем

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

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

У меня также есть возможность, если он поможет вставить <*****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 самых популярных почтовых клиентов и начать создавать пользовательские Regex для каждого. Тогда для каждого из этих клиентов, а также различные настройки локали, поскольку я предполагаю, что язык пользователя будет также влиять на то, что добавлено.

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

Related of "Получите фактическое сообщение электронной почты, которое только что написал человек, за исключением любого цитируемого текста"

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

Интересно, что даже у инженеров 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.

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

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

У таких страниц, как Github и Facebook, есть эта проблема.

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

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

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

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

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

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