2016-03-20 3 views
0

私のプログラムの目的は、テキストファイルの内容を電子メールアドレスに自動的に送信することです。送信は完璧に動作しますが、問題はテキストファイルの内容をpayload_text定数charに格納した文字列 "line"を取得する方法が見つからないようです。 私はアマチュアのプログラマーであり、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用のconst char配列内の行にアクセスするために、私は同様に、直接アレイにアクセス:

payload_text[9] = line; 

しかし、ラインが文字列であるように、それはpayload_textアレイのメンバーとして格納することができません。これを解決するために、私はそれをそのまま変換しました。アマチュアとはまだ学校でイム、私が言ったようにずさんな説明、申し訳ありません

payload_text[9] = line.c_str(); 

、これは誰かに役立ちます願っています。

  • EDIT - 配列の最後の行は常にNULLでなければならないこと、またはプログラムがクラッシュすることを忘れないでください。
関連する問題