1

Win7 の C++ で MIME ヘッダー (SMTP 経由で送信される) 内の情報を動的に変更する方法を理解しようとしています。

以下は、私が使用している MIME ヘッダーの基本的なレイアウトです。

char *payload_text[]={

  "Date: Sun, 14 Oct 2012 12:59:19 +1000\n",
  "To: " TO "\n",
  "From: " FROM "\n",
  "Cc: " CC "\n",
  "Message-ID: <sender@greenearth.com>\n",
  "Subject: This is a test with the payload as char\n",
  "\n",
  "Here is where the info goes\n",
  "\n ",
  NULL
  };

たとえば、呼び出されたときにヘッダーファイルの件名を変更し、char配列を返す関数を作成したいと思います(私の理解では)。これが私がこれを試みている方法です。

char *part1[]={

  "Date: Sun, 14 Oct 2012 12:59:19 +1000\n",
  "To: " TO "\n",
  "From: " FROM "\n",
  "Cc: " CC "\n",
  "Message-ID: <sender@greenearth.com>\n",
  "Subject: This is a test with the payload as char\n",
  "\n"
};

char *body [] = { "Test information.", 
                   "More test info" };

char *full_payload [ strlen(*part1) + strlen(*body) + 1 ];

strcat( *full_payload, *part1 );

strcat( *full_payload, *body );

cout << *full_payload;

ペイロードを表示すると、両方の部分の最初の文字列のみが表示されます

コンソールの出力:

[several junk bytes]Date: Sun, 14 Oct 2012 12:59:19 +1000
Test information.

一方、MIME ヘッダー全体が表示されるはずです。

なぜこれが機能しないのか理解できません。問題は、C++ での {} の動作を理解していないことと、このコンテキストに該当するチュートリアル/サンプル コードを見つけることができないことにあると思います (ほとんどは、コンマで区切られた複数の文字列を持たない char 配列のみを扱っているようです)曲線ブラケットの内側)。

簡単に言えば、中かっこで囲まれた文字列の既存の文字配列の末尾に文字列を追加するにはどうすればよいですか?

読んでいただきありがとうございます。アドバイスを温かく受け取らせていただきます。

ファローアップ:

関数を使用して を作成しstd::string、それを に変換すると、const char *必要に応じて MIME メッセージがフォーマットされますが、SMTP に使用しているライブラリでは機能しません。

最終結果は、が行うように見えるものではchar* payload[] = {"strings, seperated, by, comma"};なく、 の形式でなければなりません。char *payload = "strings\nseperated\nby\ncommas".c_str()

std::stringまたはchar* array[]をに変換する方法を知っている人はいchar* payload[] = {"strings, seperated, by, comma"};ますか? ブラケットは重要な部分だと思います。


簡単な質問:

char *first_array[]  = { "one", "two" };

char *second_array[] = { "three", "four"};

char *final_array[ strlen(*first_array) + strlen(*second_array) + 1];

strcpy( *final_array, *second_array );

cout << *final_array;

first_array と second_array を final_array に結合するにはどうすればよいですか? このように実装すると、プログラムがクラッシュしますstrcopy()strcat()この基本操作だけでいいと思います。

4

2 に答える 2

1

part1およびで、body単一の文字列ではなく、文字列の配列を作成しています。これは次のことと似ています。

int values[] = { 1, 2, 3, 4 };

この{}コンテキストでは、配列内のアイテムを定義しています。したがって*part1、それぞれの最初の行のみを参照してください。コードは、と*bodyの最初の文字列の内容をコピーしています。part1body

ジャンクバイトstrcatについては、最初のnull文字を探し、そこから開始してnullを置き換えます。したがって、最初の文字列は。を使用して追加する必要がありますstrcpy

これを適切に処理std::vector<const char *> mimeするには、がと同じレイアウトになることに注意してconst char * mime[]ください。これを使用して、文字列の配列を作成できます。

void send_smtp_message(const char **message);

void build_mime_header(std::vector<const char *> &mime)
{
    mime.push_back("Date: ...");
    mime.push_back("From: " FROM);
    // ...
    mime.push_back(""); // for the newline between header and body
}

void main()
{
    std::vector<const char *> mime;
    build_mime_header(mime);
    mime.push_back("This is a test.");
    mime.push_back(NULL); // if the API requires this for end-of-data.
    send_smtp_message(&mime[0]);
}
于 2012-10-14T22:11:05.373 に答える
0

C ++を使用している場合は、通常、を使用するよりも安全でstring、標準ライブラリのクラスを使用する方が簡単char*です。C ++文字列は、「+」演算子で連結できます。c_str()メンバー関数を使用して、c++文字列をconstchar*に変換することもできます。

これがあなたが望むことをするような関数です:

#include <string>
#include <iostream>

std::string makeheader(std::string to, std::string from,
                       std::string cc, std::string subject)
{
    std::string header =
        "Date: Sun, 14 Oct 2012 12:59:19 +1000\n"
        "To: " + to + "\n"
        "From: " + from + "\n"
        "Cc: " + cc + "\n"
        "Message-ID: <sender@greenearth.com>\n"
        "Subject:" + subject + "\n";

    return header;
}

int main()
{
    std::cout << makeheader("example@example.com", "example@example.com",
                            "example@example.com", "This is a test with the payload as char.");
};
于 2012-10-14T21:48:19.593 に答える