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

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

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

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

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

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

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

On Wed, Nov 2, 2011 at 10:34 AM, Message Platform <[email protected]> wrote:
## In replies all text above this line is added to your message conversation ##

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

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

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


person Layke    schedule 02.11.2011    source источник


Ответы (6)


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

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

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

person Pedro    schedule 02.01.2018
comment
Переключился на принятый ответ. Отличный вклад, чтобы ответить на действительно старый вопрос. - person Layke; 04.01.2018

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

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

person geerlingguy    schedule 26.09.2012
comment
Я также включаю третий метод (и дальнейшие улучшения) в эту библиотеку Imap для PHP: github.com/geerlingguy/ Сопоставить - person geerlingguy; 27.09.2012
comment
Я проверю это. Ссылка для справки. github.com/geerlingguy/Imap/blob/1.x/ Имап.php#L434 - person Layke; 10.10.2012

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

person philfreo    schedule 26.05.2014

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

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

person sascha    schedule 02.11.2011

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

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

Протестируйте https://regex101.com/r/xO8nI1/2.

person radzserg    schedule 06.05.2016

person    schedule
comment
Исходное электронное письмо из предложения недоступно для переадресованных электронных писем. - person potato; 05.03.2020