我使用libcurl和IMAP从电子邮件收件箱中获取消息。我可以完全获取消息,但无法获取标头字段;我的curl写函数只返回第一行。
这是我的代码:
std::string fetchdata;
size_t write_data(char* buf, size_t size, size_t nmemb, void* up) {
fetchdata.append((char*)buf, size*nmemb);
return size*nmemb;
}
int fetchmail() {
CURL *curl;
CURLcode res = CURLE_OK;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_USERNAME, "myemail@gmail.com");
curl_easy_setopt(curl, CURLOPT_PASSWORD, "mypassword");
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_URL, "imaps://imap.gmail.com:993/INBOX");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "UID FETCH 10 BODY[HEADER.FIELDS (To)]");
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
std::ofstream outfile("C:\\Path\\fetched.txt", std::ios_base::app);
outfile << fetchdata;
outfile.close();
return (int)res;
}运行fetchmail输出
* 3 FETCH (UID 10 BODY[HEADER.FIELDS (To)] {29}在fetched.txt中。然而,这只是第一行;控制台输出
* 3 FETCH (UID 10 BODY[HEADER.FIELDS (To)] {29}
To: laboutpost3@gmail.com
)
A004 OK Success如果我将write_data()修改为
size_t write_data(char* buf, size_t size, size_t nmemb, void* up) {
fetchdata.append((char*)buf, size*nmemb);
std::cout << buf;
return size*nmemb;
}it输出
* 3 FETCH (UID 10 BODY[HEADER.FIELDS (To)] {29
To: laboutpost3@gmail.com
)
A004 OK Success
ted. (Success)
(Success)
(Success)
WRITE] INBOX selected. (Success)
[UIDNEXT 12] Predicted next UID.
* OK [HIGHESTMODSEQ 1759]
A003 OK [READ-WRITE] INBOX selected. (Success)
* OK [HIGHESTMODSEQ 1759]
A003 OK [READ-WRITE] INBOX selected. (Success)这是我的write_data()的问题吗?buf似乎掌握了所有的信息。
发布于 2014-11-25 02:40:55
buf函数中的write_data()参数不是以空结尾的,但是调用cout << buf需要一个空终止符,因为buf是一个char*指针。因此,您正在打印周围内存的内容。buf数据只是原始字节,这就是为什么将缓冲区大小作为另一个参数的原因。在打印buf时,您必须考虑到这个大小,例如:
std::cout << std::string(buf, size*nmemb);另一种选择是:
std::cout.write(buf, size*nmemb);由于您使用的是CURLOPT_CUSTOMREQUEST,curl以-is的形式发送请求,并以-is的形式返回服务器的回复。在这种情况下,curl没有上下文可以知道请求是什么,或者如何为您处理答复。如果要提取较小的部分,则必须自己解析答复。
您可能需要查看curl的文档和示例,特别是使用IMAP url的UID和SECTION参数(完整语法为RFC 5092 ),例如:
curl_easy_setopt(curl, CURLOPT_URL, "imaps://imap.gmail.com:993/INBOX/;uid=10/;section=HEADER.FIELDS%20(To)");这将允许curl生成自己的FETCH请求,而不必手动使用CURLOPT_CUSTOMREQUEST。由于curl正在创建FETCH请求,所以它更有可能为您解析响应,只将请求的头数据提供给您的write_data()函数,这样它就更少需要手动解析/删除。
https://stackoverflow.com/questions/27115807
复制相似问题