首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ libcurl取头字段

C++ libcurl取头字段
EN

Stack Overflow用户
提问于 2014-11-24 23:00:47
回答 1查看 2.4K关注 0票数 1

我使用libcurl和IMAP从电子邮件收件箱中获取消息。我可以完全获取消息,但无法获取标头字段;我的curl写函数只返回第一行。

这是我的代码:

代码语言:javascript
运行
复制
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输出

代码语言:javascript
运行
复制
* 3 FETCH (UID 10 BODY[HEADER.FIELDS (To)] {29}

在fetched.txt中。然而,这只是第一行;控制台输出

代码语言:javascript
运行
复制
* 3 FETCH (UID 10 BODY[HEADER.FIELDS (To)] {29}
To: laboutpost3@gmail.com

)
A004 OK Success

如果我将write_data()修改为

代码语言:javascript
运行
复制
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输出

代码语言:javascript
运行
复制
* 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似乎掌握了所有的信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-25 02:40:55

buf函数中的write_data()参数不是以空结尾的,但是调用cout << buf需要一个空终止符,因为buf是一个char*指针。因此,您正在打印周围内存的内容。buf数据只是原始字节,这就是为什么将缓冲区大小作为另一个参数的原因。在打印buf时,您必须考虑到这个大小,例如:

代码语言:javascript
运行
复制
std::cout << std::string(buf, size*nmemb);

另一种选择是:

代码语言:javascript
运行
复制
std::cout.write(buf, size*nmemb);

由于您使用的是CURLOPT_CUSTOMREQUEST,curl以-is的形式发送请求,并以-is的形式返回服务器的回复。在这种情况下,curl没有上下文可以知道请求是什么,或者如何为您处理答复。如果要提取较小的部分,则必须自己解析答复。

您可能需要查看curl的文档和示例,特别是使用IMAP url的UIDSECTION参数(完整语法为RFC 5092 ),例如:

代码语言:javascript
运行
复制
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()函数,这样它就更少需要手动解析/删除。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27115807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档