Чтение писем из учетной записи gmail POP3 с помощью libCurl

В настоящее время я работаю в проекте C ++, который должен уметь читать электронную почту из учетной записи POP3 в gmail, как и написано в заголовке. Также важно сказать, что мне нужно скачать вложения (кодировать base64?) Письма и его тело.
Дело в том, что все рекомендуют использовать libCurl для этой задачи, но пример кода в их сети не работает.
Я видел этот пример на Веб-сайт Libcurl:

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
CURL *curl;
CURLcode res;

curl = curl_easy_init();
if(curl)
{
/* Set username and password */
curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");

/* This will only fetch the message with ID "1" of the given mailbox */
curl_easy_setopt(curl, CURLOPT_URL, "pop3s://[email protected]/1");

/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);

/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));

/* always cleanup */
curl_easy_cleanup(curl);
}
return 0;
}

Как видите, код выглядит довольно легко для извлечения электронной почты по электронной почте из папки входящих сообщений, но когда я пытаюсь выполнить операцию с CURLcode curl_easy_perform (CURL *) функция ничего не возвращает, и процесс «умирает», поэтому я не могу пропустить эту строку.
Мой код следующий:

void MailServer::Open(char *username,char *password)
{
m_username = username; //username = [email protected]
m_password = password; //password = blabla123

curl = curl_easy_init();
curl_easy_setopt(curl,CURLOPT_USERNAME,username);
curl_easy_setopt(curl,CURLOPT_PASSWORD,password);

m_popsAccount = "pop3s://" + m_username +"/1";

curl_easy_setopt(curl, CURLOPT_URL, m_popsAccount.c_str());
res = curl_easy_perform(curl); //here does not return anything

}

Я пытался найти какой-то «чистый» пример в Интернете, но я действительно не мог …
Кто-нибудь может мне помочь? 🙂

8

Решение

Я сделал это, ребята! Вот хороший пример того, как вы можете получить доступ к учетной записи Gmail и посмотреть, что внутри. В настоящее время я работаю над анализом информации внутри, потому что на самом деле он только получает количество писем на входящие и его размер.
Если вы измените URL как «Выскакивает: //pop.gmail.com: 995/1» он вернет содержимое messege, а также кодировку base64 для вложений. В любом случае, спасибо … вот код! 🙂

#pragma region Types
struct MemoryStruct {
char *memory;
size_t size;
};
#pragma endregion

void MailServer::Open(char *username,char *password)
{
m_username = username;
m_password = password;
struct MemoryStruct chunk;

chunk.memory = (char*) malloc(1);  //crecerá según sea necesario con el realloc
chunk.size = 0;    //no hay datos en este punto

//inicializacion
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();//login
curl_easy_setopt(curl,CURLOPT_USERNAME,username);
curl_easy_setopt(curl,CURLOPT_PASSWORD,password);

m_popsAccount = "pop3s://pop.gmail.com:995/";

curl_easy_setopt(curl, CURLOPT_URL, m_popsAccount.c_str());
curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);

curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);

//some servers needs this validation
curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");

res = curl_easy_perform(curl);

if(res != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
}
else
{
/*
here is where you can work with the data inside the chunk...
*/
printf("%s\n",chunk.memory); //here is the information
printf("%lu bytes retrieved\n", (long)chunk.size);
}

//se libera la memoria si hay datos
if(chunk.memory)
free(chunk.memory);
/* always cleanup */

curl_global_cleanup();
}size_t MailServer::WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)userp;

mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
if(mem->memory == NULL) {
/* out of memory! */
printf("not enough memory (realloc returned NULL)\n");
return 0;
}

memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;

return realsize;
}
11

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]