【问题标题】:Composing MIME headers from scratch从头开始编写 MIME 标头
【发布时间】:2012-10-14 21:06:38
【问题描述】:

我试图弄清楚如何在 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;

查看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() 在这样实现时会导致程序崩溃。我想我需要做的就是这个基本操作。

【问题讨论】:

  • 如果您无法生成动态 Message-Id,请忽略它,您的 MTA 将分配一个 Message-Id。如果您需要在发送消息之前知道 Message-Id,请确保为每条消息生成一个唯一 ID。

标签: c++ arrays char concatenation mime


【解决方案1】:

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

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

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

对于垃圾字节,strcat 查找第一个空字符并从那里开始,替换空字符。因此,应使用strcpy 附加第一个字符串。

要正确处理此问题,请注意 std::vector&lt;const char *&gt; 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]);
}

【讨论】:

  • 我在 build_mime_header 的函数声明行和 dev c++ 中 std::vector 的声明中遇到了一些编译器错误。看起来很棒的代码,这将依赖哪些头文件?谢谢里斯。
  • 那段代码依赖向量库,所以一定要写#include &lt;vector&gt;
  • 我选择你的答案。这就是我一直在寻找的,因为它适用于我的 SMTP 代码,现在我不必使用额外的 MIME 库,您对 SMTP 的体验表明了!
【解决方案2】:

如果您使用 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.");
};

【讨论】:

  • 您可以通过执行s.c_str() 将任何std::string 转换为const char*,其中s 是std::string。查看文档:cplusplus.com/reference/string/string/c_str
  • @JoaoMendesino: 使用c_str() -- 给定std::string mime;void send_smtp(const char *data) 你可以写send_smtp(mime.c_str()); 这将返回一个const char *mime 中的字符串。
  • 非常感谢您的用户,我试过了,但是在转换它时遇到了一些问题。请参阅正文的附加信息。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多