2011-05-13 220 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”,然后进入缓冲区。这是可取的,因为您可以更容易地存储标题值,并且执行行读取与较大缓冲区的开销可以忽略不计。