如何在 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.gitadd_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 作为第三个参数传入。