2016-03-20 24 views
0

Цель моей программы - отправить содержимое текстового файла автоматически на адрес электронной почты. Хотя отправка работает отлично, проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти способ получить строку «строка», в которой я сохранил содержимое текстового файла, в константу char полезной нагрузки. Я любитель-программист, и я очень новичок в libcurl, но поскольку это часть школьного проекта, любая помощь будет принята с благодарностью.Опытная проблема с текстом полезной нагрузки в libcurl

Я не буду упоминать, что я пытался сделать, чтобы решить эту проблему, так как в ретроспективе все мои потенциальные решения были немыми. Ниже вы найдете код.

#include <stdio.h> 
#include <string.h> 
#include <curl.h> 
#include <iostream> 
#include <fstream> 
using namespace std; 


#define FROM "<[email protected]>" 
#define TO  "[email protected]>" 
#define CC  "<[email protected]>" 





static const char *payload_text[] = { 
    "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n", 
    "To: " TO "\r\n", 
    "From: " FROM "(Example User)\r\n", 
    "Cc: " CC "(Another example User)\r\n", 
    "Message-ID: <[email protected]" 
    "rfcpedant.example.org>\r\n", 
    "Subject: SMTP TLS example message\r\n", 
    "\r\n", /* empty line to divide headers from body, see RFC5322 */ 
    "The body of the message starts here.\r\n", 
    "\r\n", 
    "It could be a lot of lines, could be MIME encoded, whatever.\r\n", 
    "Check RFC5322.\r\n", 
    NULL 
}; 

struct upload_status { 
    int lines_read; 
}; 

static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) 
{ 
    struct upload_status *upload_ctx = (struct upload_status *)userp; 
    const char *data; 

    if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { 
    return 0; 
    } 

    data = payload_text[upload_ctx->lines_read]; 

    if(data) { 
    size_t len = strlen(data); 
    memcpy(ptr, data, len); 
    upload_ctx->lines_read++; 

    return len; 
    } 

    return 0; 
} 

int main(void) 
{ 

    string line; 
    ifstream myfile ("log.txt"); 
    if (myfile.is_open()) 
    { 
    while (getline (myfile,line)) 
    { 
     cout << line << '\n'; 
    } 
    myfile.close(); 
    } 
const char * lchr = line.c_str(); 


    CURL *curl; 
    CURLcode res = CURLE_OK; 
    struct curl_slist *recipients = NULL; 
    struct upload_status upload_ctx; 

    upload_ctx.lines_read = 0; 

    curl = curl_easy_init(); 
    if(curl) { 
    /* Set username and password */ 
    curl_easy_setopt(curl, CURLOPT_USERNAME, "[email protected]"); 
    curl_easy_setopt(curl, CURLOPT_PASSWORD, "********"); 
    curl_easy_setopt(curl, CURLOPT_URL, "smtp://smtp.gmail.com:587"); 
    curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); 
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); 
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); 
    curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); 
    recipients = curl_slist_append(recipients, TO); 
    recipients = curl_slist_append(recipients, CC); 
    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); 
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); 
    curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); 
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);  
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);  
    res = curl_easy_perform(curl); 

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


    curl_slist_free_all(recipients); 

    curl_easy_cleanup(curl); 
    } 

    return (int)res; 
} 

ответ

0

Хорошо, ребята, так как никто не ответил, я понял это самостоятельно. Если кто-то испытывает подобную проблему, вот решение. Для того, чтобы получить доступ к линии в массиве символов payload_text сопзИте, я получил доступ к массиву непосредственно следующим образом:

payload_text[9] = line; 

Однако, как строка является строкой, она не может быть сохранена в качестве члена массива payload_text. Чтобы решить эту проблему, я просто преобразовал ее как таковую.

payload_text[9] = line.c_str(); 

Извините за неаккуратного объяснения, как я сказал, Im любитель и еще в школе, надеюсь, это поможет кому-то.

  • EDIT - Помните, что последняя строка в массиве всегда должна быть NULL или программа выйдет из строя.

 Смежные вопросы

  • Нет связанных вопросов^_^