2011-05-13 162 views
0

我試圖從電子郵件中獲取正文,但我不知道如何。身體與頭部之間的空間分開。你能給我舉一些例子嗎?解析字符串C

謝謝。

的消息看起來像這樣(有標題和正文):

From [email protected] Fri May 13 12:28:30 2010 
Return-Path: <[email protected]> 
X-Original-To: [email protected] 
Delivered-To: [email protected] 
Received: from cristi?localhost (localhost [127.0.0.1]) 
by Notebook (Postfix) with SMTP id 50F6F809E0 
for <[email protected]>; Fri, 13 May 2010 12:28:30 +0300 (EEST) 
Message-Id: <[email protected]> 
Date: Fri, 13 May 2010 12:28:30 +0300 (EEST) 
From: [email protected] 
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; 
+0

請說明您的問題:給一個示例電子郵件。你用空格隔開什麼意思?這是一個線條空間嗎? – Roalt 2011-05-13 09:46:03

回答

0

找到POP RFC。閱讀規範。

我沒有閱讀POP,但我讀過SMTP。在SMTP中,我想我回想起頭文件以「\ r \ n \ r \ n」結尾。也許這對POP來說是一樣的。

0

如果我理解正確,身體被換行符隔開,所以我們可以保留一個變量,告訴我們是否已經遇到該換行符。在這種情況下複製文本,否則檢查我們是否已達到它。

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

謝謝你的答案,但我仍然有問題。基本上我想要做的是提取消息的正文...只是來自電子郵件的文本。電子郵件存儲在緩衝區中。 – Vlasin 2011-05-13 14:14:04

+0

@Vlasin:這應該可以做到 – BlackBear 2011-05-13 16:19:53

0

你讓這個太複雜了。你的身體開始if(strnstr(buffer, "\r\n\r\n", sizeof(buffer)) != NULL)。現在,您只需編寫緩衝區在「\ r \ n \ r \ n」序列內分裂的4個例外。

另一種方法是直接讀取「\ r \ n」,然後進入緩衝區。這是可取的,因爲您可以更容易地存儲標題值,並且執行行讀取與較大緩衝區的開銷可以忽略不計。