如何在 C++ 中创建电子邮件消息

如何在 C++ 中创建电子邮件消息

Aspose.Email FOSS for C++ 允许您使用 mapi_message::create() 在代码中构建完整结构的 Outlook MSG 文件。您可以设置主题、纯文本和 HTML 正文、发件人身份、收件人,并通过一次调用将结果保存到 MSG 或 EML ——无需安装 Outlook。

步骤 1 — 设置项目

git clone https://github.com/aspose-email-foss/Aspose.Email-FOSS-for-Cpp.git
add_subdirectory(Aspose.Email-FOSS-for-Cpp)
target_link_libraries(your_target PRIVATE AsposeEmailFoss::AsposeEmailFoss)

步骤 2 — 创建消息并设置主题和正文

mapi_message::create() 接受主题和纯文本正文作为构造函数参数:

#include "aspose/email/foss/msg/mapi_message.hpp"

auto message = aspose::email::foss::msg::mapi_message::create(
    "Quarterly Status Update",
    "Hello team,\n\nPlease find the summary below.\n\nRegards,\nEngineering");

创建后,您也可以通过 set_subject() 和 set_body() 更新主题或正文:

message.set_subject("Revised: Quarterly Status Update");
message.set_body("Updated body text.");

步骤 3 — 设置发件人属性

使用 set_sender_name() 和 set_sender_email_address() 来标识发件人。地址类型默认是 SMTP;如有需要可使用 set_sender_address_type() 覆盖。

message.set_sender_name("Build Agent");
message.set_sender_email_address("build.agent@example.com");

步骤 4 — 添加收件人

add_recipient() 将收件人追加到消息中。每个收件人调用一次:

message.add_recipient("alice@example.com", "Alice Example");
message.add_recipient("bob@example.com", "Bob Example");

步骤 5 — 设置 HTML 正文

使用 set_html_body() 存储 HTML 版本的消息正文。纯文本和 HTML 正文可以共存;电子邮件客户端会选择更丰富的格式:

message.set_html_body(
    "<html><body>"
    "<p>Hello team,</p>"
    "<p>Please find the <b>quarterly summary</b> below.</p>"
    "<p>Regards,<br>Engineering</p>"
    "</body></html>");

步骤 6 — 保存到 MSG

save() 将消息序列化为 Outlook MSG 格式。传入 std::filesystem::path 可直接写入磁盘,传入 std::ostream 可进行流输出,或在不传参的情况下返回 std::vector<std::uint8_t>:

#include <filesystem>
#include <fstream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    auto message = aspose::email::foss::msg::mapi_message::create(
        "Meeting Notes", "Details inside.");
    message.set_sender_name("Alice");
    message.set_sender_email_address("alice@example.com");
    message.add_recipient("bob@example.com", "Bob");

    // Save to file path
    message.save(std::filesystem::path("meeting_notes.msg"));

    // Save to stream
    std::ofstream out_stream("meeting_notes_stream.msg", std::ios::binary);
    message.save(out_stream);

    // Save to bytes in memory
    auto bytes = message.save();
}

步骤 7 — 保存到 EML

使用 save_to_eml() 生成 RFC 5322 / MIME 文件,而不是 MSG。同样提供三种重载方式(路径、流或字节):

#include <filesystem>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    auto message = aspose::email::foss::msg::mapi_message::create(
        "Hello", "World");
    message.set_sender_name("Alice");
    message.set_sender_email_address("alice@example.com");
    message.add_recipient("bob@example.com", "Bob");

    message.save_to_eml(std::filesystem::path("hello.eml"));
}

常见问题与解决方案

消息已保存,但 Outlook 显示乱码。 确保消息使用 Unicode 字符串支持创建。 mapi_message::create() 默认启用 Unicode 字符串。如果需要强制使用 ANSI 编码(很少需要),请传递 false 作为第三个参数: mapi_message::create(subject, body, false).

save() 流输出为空或已损坏。 始终使用以下方式打开输出流 std::ios::binary. 文本模式流在 Windows 上会转换换行符,破坏二进制 CFB 结构。

收件人在 Outlook 的收件人/抄送字段中未显示。 add_recipient() 将收件人添加到 MAPI 收件人表中。此外,还设置 display_to 通过 MAPI 属性 set_property() with common_message_property_id::display_to and property_type_code::ptyp_string 使 Outlook 在标题中显示名称。

HTML 正文未渲染。 确认 HTML 字符串结构良好,具有起始和结束标签。 <html><body> 标签。此外,请验证接收客户端支持 HTML 邮件;某些简约客户端仅渲染纯文本。

set_internet_message_id() 没有效果。 set_internet_message_id() 设置用于线程的 MAPI Internet 消息 ID。此属性是可选的,对于有效的 MSG 文件并非必需。

常见问题

创建 MSG 文件的最简方法是什么?

#include <fstream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    auto message = aspose::email::foss::msg::mapi_message::create("Hello", "Body");
    message.set_sender_name("Alice");
    message.set_sender_email_address("alice@example.com");
    std::ofstream out("hello.msg", std::ios::binary);
    message.save(out);
}

我可以仅创建一个只有 HTML 正文而没有纯文本正文的邮件吗?

是的。调用 mapi_message::create(subject, "") 以让纯文本正文为空,然后调用 set_html_body() 来设置 HTML 内容。

我该如何设置邮件类?

使用 set_message_class() 并提供 MAPI 邮件类字符串,例如对于标准电子邮件,可使用 "IPM.Note":

message.set_message_class("IPM.Note");

我可以设置用于线程的 Internet Message-ID 吗?

是的。调用 set_internet_message_id(),并传入一个 RFC 2822 格式的消息 ID 字符串:

message.set_internet_message_id("<msg-001@example.com>");

默认情况下是否启用 Unicode?

是的。mapi_message::create(subject, body) 的两参数形式会启用 Unicode 字符串。若要创建传统的 ANSI 消息,请将 false 作为第三个参数传入。

另请参阅

 中文