从头开始编写MIME标头

时间:2012-10-14 21:06:38

标签: c++ arrays char concatenation mime

我试图弄清楚如何在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::stringchar* 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()导致程序在执行时崩溃。我认为我需要做的就是这个基本操作。

2 个答案:

答案 0 :(得分:1)

part1body中,您创建的是字符串数组,而不是单个字符串。这类似于:

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

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

对于垃圾字节,strcat查找第一个空字符并从那里开始,替换为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]);
}

答案 1 :(得分: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.");
};