2014-11-24 2 views
1

IMAP과 함께 libcurl을 사용하여 전자 메일받은 편지함에서 메시지를 가져옵니다. 메시지를 완전히 가져올 수는 있지만 헤더 필드를 가져올 수 없습니다. curl에 대한 write 함수는 첫 번째 줄만 반환합니다.C++ libcurl IMAP 가져 오기 헤더 필드

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, "[email protected]"); 
     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 출력 fetched.txt에서

* 3 FETCH (UID 10 BODY[HEADER.FIELDS (To)] {29} 

실행 :

여기 내 코드입니다. 그러나 이것은 첫 번째 줄에 불과합니다. 콘솔 출력

* 3 FETCH (UID 10 BODY[HEADER.FIELDS (To)] {29} 
To: [email protected] 

) 
A004 OK Success 

내가이 내 write_data()에 문제가

* 3 FETCH (UID 10 BODY[HEADER.FIELDS (To)] {29 
To: [email protected] 

) 
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()

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; 
} 

에 수정하는 경우? buf 모든 정보가있는 것 같습니다.

+0

'write_data()'함수의'buf' 매개 변수는 null로 끝나지 않지만'cout << buf;'는 그것을 필요로합니다. 주변 메모리의 내용을 인쇄하고 있습니다. 버퍼는 raw 바이트 일 뿐이므로 다른 매개 변수로 버퍼 크기가 지정됩니다. –

+0

대신에 임시적인'std :: string'을 쓸 수 있습니다 :'cout << string (buf, size * nmemb);' –

+0

그러나 버퍼에 내가 필요한 것을 포함하고 있다면'write_data()'가 잘못된 크기를 전달 했습니까? –

답변

1

write_data() 함수의 buf 매개 변수는 null로 끝나는 것이 아니라 bufchar* 포인터이기 때문에 cout << buf를 호출하면 널 (NULL) 종료해야합니다. 따라서 주변 메모리의 내용을 인쇄하고 있습니다. buf 데이터는 그냥 원시 바이트입니다. 따라서 다른 매개 변수로 버퍼 크기가 지정됩니다. buf를 인쇄 할 때, 당신은 예를 들어, 계정으로 그 크기를 가지고 가야 : 또는

std::cout << std::string(buf, size*nmemb); 

:

std::cout.write(buf, size*nmemb); 

당신이 CURLOPT_CUSTOMREQUEST을 사용하고 있기 때문에, 컬는 그대로 요청을 전송하고 서버의 당신을 제공합니다 있는 그대로 응답하십시오. 이 상황에서 컬은 요청이 무엇인지 또는 응답을 처리하는 방법을 알기위한 컨텍스트가 없습니다. 작은 부분을 추출하려면 응답을 직접 파싱해야합니다.

당신은 특정 사용, 컬의 문서와 예제를 볼 수도는 IMAP URL (전체 구문 RFC 5092 읽기), 예를 들면의 UIDSECTION 매개 변수 :에 컬을 수

curl_easy_setopt(curl, CURLOPT_URL, "imaps://imap.gmail.com:993/INBOX/;uid=10/;section=HEADER.FIELDS%20(To)"); 

CURLOPT_CUSTOMREQUEST을 수동으로 사용하지 않고도 자체 FETCH 요청을 생성하십시오. 컬이 FETCH 요청을 작성하고 있기 때문에 요청한 헤더 데이터를 write_data() 함수에 제공하여 응답을 구문 분석 할 가능성이 높아지기 때문에 수동으로 분석/제거하는 것이 적습니다.

+0

curl은 "; uid = XXX"매개 변수를 사양별로 IMAP UID가 아닌 메시지 번호로 해석합니다. IOW, URL 변형은 UID FETCH가 아닌 간단한 FETCH를 발행합니다. – ancow