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 *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 数组弯曲括号内)。

简而言之,如何将字符串附加到包含在曲括号中的现有字符串字符数组的末尾?

感谢您的阅读,我们会热情地接受建议。

跟进:

使用该函数创建 astd::string然后将其转换为 aconst char *它可以根据需要格式化 MIME 消息,但无法与我用于 SMTP 的库一起使用。

最终结果必须是形式,char* payload[] = {"strings, seperated, by, comma"};而不是看起来要做char *payload = "strings\nseperated\nby\ncommas"的事情。.c_str()

有谁知道如何将 a 转换为a 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

part1andbody中,您正在创建一个字符串数组,而不是单个字符串。这类似于这样做:

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

{}此上下文中定义数组中的项目。因此*part1*body仅引用每个的第一行 - 您的代码正在复制 and 中的第一个字符串的part1内容body

至于垃圾字节,strcat查找第一个空字符并从那里开始,替换空。因此,应使用 追加第一个字符串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++ 字符串转换为 const char*。

这是一个可以满足您需求的功能:

#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 回答