среда, 6 октября 2010 г.

Прием почты с помощью сURL

В последней версии сURL появилась возможность работы с почтовыми протоколами POP3 и SMTP. Вот небольшой пример, как получить почту по протоколу POP3 с яндекса.

/***************************************************
Пример показывает как получить почту по протоколу  POP3
При запуске без параметров - выводит список номеров 
сообщений в почтовом ящике.
При передачи параметра (числа) в командной строке
программа - считает конкретное сообщение, за номером 
таким-то, из почтового ящика.

Автор: PINGI-PINGI
****************************************************/
#include <string>
#include <iostream>
#include <fstream>
#include "curl/curl.h"
using namespace std;

static char errorBuffer[CURL_ERROR_SIZE];
static string buffer;
// Call Back ф-ия. вызывается каждый раз при приеме данных
static int writer(char *data, size_t size, size_t nmemb, string *buffer)
{
    int res = 0;
    if (buffer != NULL)
    {
        buffer->append(data, size * nmemb);
        res = size * nmemb;
    }
    return res;
}

int main(int argc, char **argv)
{
    string filename = "result.txt";
    string link;
    string number_of_mail;    
    link = "pop3://YouLogin:YouPassword@pop.yandex.ru";
    if (argc == 2)
    {
       number_of_mail.assign (argv[1]);       
       link += "/";
       link += number_of_mail;
    }        
    CURL *curl;
    CURLcode result;    
    curl = curl_easy_init();    
    if (curl)
    {       
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
        
        //Задем опции
        curl_easy_setopt(curl, CURLOPT_URL, link.c_str()); 
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
        //Выполняем...
        result = curl_easy_perform(curl);        
        if (result == CURLE_OK)
        {
            std::ofstream out_file (filename.c_str());
            if (out_file.is_open())
            {
                cout << "Write Data to "<< filename << endl;
                out_file << buffer;
            }
            out_file.close ();
        }
        else
            cout << "Error! " << errorBuffer << endl;

    }
    curl_easy_cleanup(curl);
    return 0;
}

Комментариев нет:

Отправить комментарий