Надежный способ получить только текст письма, исключая предыдущие письма - PullRequest
7 голосов
/ 24 марта 2011

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

Есть ли надежный способ, которым я могу извлечь только новое сообщение, не зная о предыдущих письмах? Я использую email класс Python.


Пример сообщения:

Content-Type: text/plain; charset=ISO-8859-1

test message! This is the part I want.

On Thu, Mar 24, 2011 at 3:51 PM, <test@test.com> wrote:

> Hi!
>
> Herman just posted a comment on the website:
>
>
> From: Herman
> "Hi there! I might be interested"
>
>
> Regards,
> The Website Team
> http://www.test.com
>

Это ответное сообщение от gmail, я уверен, что другие клиенты могут сделать это по-другому. Хорошим началом, вероятно, будет игнорирование строк, начинающихся с >, но между новым сообщением также могут быть такие строки, и тогда их, вероятно, следует сохранить. У меня также все еще будут строка типа контента и строка даты.

Ответы [ 3 ]

4 голосов
/ 24 марта 2011

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

Однако, обычный способ пометить кавычки - это поставить перед ними префикс >, поэтому строки начинаются с этого символа -особенно если в самом конце или в начале письма есть несколько символов - скорее всего, это будут кавычки.

Но On Thu, Mar 24, 2011 at 3:51 PM, <test@test.com> wrote: из вашего примера трудно извлечь.Строка, заканчивающаяся : прямо перед кавычкой, может указывать, что она принадлежит к кавычке, вы не можете знать это наверняка - она ​​также может быть частью нового сообщения, а двоеточие - просто опечатка . (на немецких клавиатурах : - это SHIFT+.).

1 голос
/ 18 июля 2018

Ответ @LAMRIN TAWSRAS будет работать для анализа текста перед выражением даты в Gmail, только если найдено совпадение, в противном случае будет выдано сообщение об ошибке.Кроме того, нет необходимости искать во всем сообщении несколько выражений даты, вам просто нужно найти первое найденное.Поэтому я бы уточнил его решение для использования re.search():

def get_body_before_gmail_reply_date(msg):
  body_before_gmail_reply = msg
  # regex for date format like "On Thu, Mar 24, 2011 at 3:51 PM"
  matching_string_obj = re.search(r"\w+\s+\w+[,]\s+\w+\s+\d+[,]\s+\d+\s+\w+\s+\d+[:]\d+\s+\w+.*", msg)
  if matching_string_obj:
    # split on that match, group() returns full matched string
    body_before_gmail_reply_list = msg.split(matching_string_obj.group())
    # string before the regex match, so the body of the email
    body_before_gmail_reply = body_before_gmail_reply_list[0]
  return body_before_gmail_reply
1 голос
/ 05 марта 2018

Я думаю, что это должно работать

import re
string_list = re.findall(r"\w+\s+\w+[,]\s+\w+\s+\d+[,]\s+\d+\s+\w+\s+\d+[:]\d+\s+\w+.*", strings) # regex for On Thu, Mar 24, 2011 at 3:51 PM
res = strings.split(string_list[0]) # split on that match
print(res[0]) # get before string of the regex
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...