Разобрать строку C - PullRequest
       3

Разобрать строку C

0 голосов
/ 13 мая 2011

Я пытаюсь получить основной текст из электронного письма, но я не знаю как. Тело отделено пробелом от заголовка. Не могли бы вы привести примеры?

Спасибо.

Сообщение выглядит так (с заголовком и телом):

From username@localhost  Fri May 13 12:28:30 2010
Return-Path: <username@localhost>
X-Original-To: recipe@localhost
Delivered-To: recipe@localhost
Received: from cristi?localhost (localhost [127.0.0.1])
by Notebook (Postfix) with SMTP id 50F6F809E0
for <test@localhost>; Fri, 13 May 2010 12:28:30 +0300 (EEST)
Message-Id: <20110513092830.50F6F809E0@Cristi-Notebook>
Date: Fri, 13 May 2010 12:28:30 +0300 (EEST)
From: username@localhost
To: undisclosed-recipients:;

Text Body

.

Пока:

while ( buffer_recieved[begin]){
    if ( buffer_recieved[begin] == '\r' && buffer_recieved[begin+1] == '\n' ) {
         body[end++]=buffer_recieved[begin];
    }
    begin++;
}
body[end]=0;

Ответы [ 3 ]

0 голосов
/ 13 мая 2011

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

bool foundBody = false;
char *bodyBegin = "\r\n\r\n";
int i = 0,j = 0, k = 0;

while(bufferReceived[i]) {
    if(foundBody)
        body[j++] = bufferReceived[i];
    else {
        if(bufferReceived[i] == bodyBegin[k])
            foundBody = bodyBegin[k++] == '\0';
        else
            k = 0;
    }

    i += 1;
}

body[j] = '\0';
0 голосов
/ 13 мая 2011

Ты делаешь это слишком сложным.Ваше тело начинает if(strnstr(buffer, "\r\n\r\n", sizeof(buffer)) != NULL).Теперь вам нужно всего лишь кодировать 4 исключения, которые существуют, когда буфер разделяется в последовательности "\ r \ n \ r \ n".

Другой подход заключается в чтении строк до тех пор, пока вы не прочитаете "\ r \ n", а затем перейти к буферам для тела.Это предпочтительнее, потому что вы можете легче хранить значения заголовков, а затраты на чтение строк по сравнению с большими буферами незначительны.

0 голосов
/ 13 мая 2011

Найдите POP RFC.Прочитайте спецификацию.

Я не читал POP, но я прочитал SMTP.Я думаю, что в SMTP заголовок оканчивается на "\ r \ n \ r \ n", а тело тоже.Может быть, то же самое для POP.

...