Как отличить сгенерированные отправителем возврат каретки от переноса слов автоматически сгенерированные возврат каретки в теле письма? - PullRequest
0 голосов
/ 29 марта 2011

Как отличить возврат каретки, созданный отправителем, от переноса каретки, созданного автоматически, в теле письма? Я использую Python imaplib для доступа к Gmail и загрузки тел сообщений следующим образом:

user='whoever@gmail.com'
pwd='password'
m = imaplib.IMAP4_SSL("imap.gmail.com")
m.login(user,pwd)
m.select("INBOX")
resp, items = m.search(None, "ALL")
items = items[0].split()
messages = []
for emailid in items:
    resp, data = m.fetch(emailid, "(RFC822)")
    email_body = data[0][1]
    mail = email.message_from_string(email_body)
    for part in mail.walk():
        if part.get_content_type() == 'text/plain':
            body = part.get_payload(decode=1)
            messages.append(body)

Я сосредоточился на случае сообщений, полученных от другого пользователя Gmail. Текст сообщения содержит несколько символов возврата каретки ('\ r \ n'). Они подразделяются на два класса: 1) вставленные отправителем электронной почты, возвращает «true», 2) созданные с помощью Gmail, заключающего слово в ~ 78 символов, возвращает «false». Я хочу удалить только второй класс возврата каретки. Я уверен, что мог бы придумать программное приближение, которое ищет '\ r \ n' в окне вокруг каждого 78-го символа, но это не будет пуленепробиваемым и не то, что я хочу. Интересно отметить, что когда сообщение отображается в Gmail в веб-браузере, возвраты второго класса не возвращаются. Gmail почему-то знает, чтобы удалить / не отображать их специально. Как? Мне не хватает какой-то специальной кодировки?

Ответы [ 2 ]

1 голос
/ 30 марта 2011

Gmail отправляет сообщения как в многочастном формате MIME, так и в текстовой / простой версии (что вы захватываете), и в текстовой / HTML-версии.Последняя версия содержит необычное форматирование, например жирный шрифт, курсив, ссылки и т. Д., И отображает Gmail.В то время как текстовая / html версия также разбита на строки из 78 символов (часть стандарта электронной почты - базовый текст никогда не должен иметь строку, превышающую 78 символов), «настоящие» разрывы строк, которые вы ищете, таковы:встроенные в него теги HTML <br>.Вы можете увидеть это сами, если отправите себе сообщение, а затем, используя маленькую стрелку вниз рядом с кнопкой Ответить, нажмите «Показать оригинал».

Вы не можете различить «поддельные» и «настоящие» строки-разрывы в текстовой / простой версии сообщения, по крайней мере, не надежно (как вы, очевидно, знаете).Вы можете , однако вместо этого извлекаете текстовую / html версию, зная, что «настоящие» разрывы строк - это теги <br>, однако вам придется иметь дело с дополнительным HTML (а также ссначала правильно обработать используемое в нем «Content-Transfer-Encoding».

0 голосов
/ 30 марта 2011

Я не знаю, сколько почтовых клиентов интерпретируют или генерируют это правильно, но RFC 3676 включает следующее:

При создании потокового текста агент создания переносит,то есть вставляет «мягкие» разрывы строк по мере необходимости.Мягкие разрывы строк добавляются в естественных точках переноса, например, между словами.Разрыв мягкой строки - это последовательность SP CRLF.

Таким образом, если в конце предыдущей строки есть пробел, текущую строку следует интерпретировать как продолжение предыдущей строки.Я предлагаю пересмотреть весь RFC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...