2016-03-20 50 views
0

我的程序的目標是自動將文本文件的內容發送到電子郵件地址。雖然發送工作完全正常,但我遇到的問題是,我似乎無法找到一種方法將字符串「行」,其中我已經將文本文件的內容存儲到payload_text常量字符中。 我是一個業餘程序員,並且對於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(); 

對不起,馬虎的解釋,正如我所說,我是一個業餘和仍然在學校,希望這可以幫助某人。

  • 編輯 - 請記住,數組中的最後一行必須始終爲NULL,否則程序將崩潰。