Bagaimana untuk menukar EML kepada MSG dalam C++
Aspose.Email FOSS for C++ supports bidirectional conversion between EML (RFC 5322 / Perkhidmatan yang disediakan oleh pihak berkuasa dan perkhidmatan yang berkaitan. mapi_message::load_from_eml() Untuk import sebuah fail yang lain, kemudian mapi_message::save() untuk menulisnya sebagai MSG - dan sebaliknya dengan mapi_message::from_file() diikuti oleh mapi_message::save_to_eml().
Langkah 1 – Menubuhkan projek
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)Langkah 2 — Menukar EML kepada MSG (Pelancaran fail)
mapi_message::load_from_eml() mengkaji fail dan mendedahkan sifat-sifatnya melalui standard yang mapi_message Hubungi kami.Call save() untuk menulis hasil sebagai MSG:
#include <filesystem>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"
int main()
{
const auto message = aspose::email::foss::msg::mapi_message::load_from_eml(
std::filesystem::path("message.eml"));
std::cout << "Subject: " << message.subject() << '\n';
std::cout << "From: " << message.sender_email_address() << '\n';
message.save(std::filesystem::path("converted.msg"));
std::cout << "Saved converted.msg\n";
}Langkah 3 — Menukar EML kepada MSG (Stream)
Gunakan aliran overload daripada load_from_eml() apabila data EML berasal daripada rangkaian yang Soket, buffer memori atau lain-lain std::istream:
#include <fstream>
#include <filesystem>
#include "aspose/email/foss/msg/mapi_message.hpp"
int main()
{
std::ifstream eml_stream("message.eml", std::ios::binary);
const auto message = aspose::email::foss::msg::mapi_message::load_from_eml(eml_stream);
message.save(std::filesystem::path("converted.msg"));
}Langkah 4 – Menukar MSG kepada EML
Mengunggah fail yang sedia ada dengan mapi_message::from_file(),Kemudian, beliau mengemukakan bahawa Format dengan save_to_eml():
#include <filesystem>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"
int main()
{
const auto message = aspose::email::foss::msg::mapi_message::from_file(
std::filesystem::path("sample.msg"));
message.save_to_eml(std::filesystem::path("exported.eml"));
std::cout << "Saved exported.eml\n";
}Langkah 5 – Melakukan perjalanan secara penuh (EML → MSG→ EML)
Contoh berikut menunjukkan bahawa subjek, badan, penghantar, penerima dan lampiran semua disimpan melalui perjalanan putaran lengkap:
#include <filesystem>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"
int main()
{
const auto msg_path = std::filesystem::path("roundtrip.msg");
const auto eml_out = std::filesystem::path("roundtrip.eml");
// EML → MSG
auto message = aspose::email::foss::msg::mapi_message::load_from_eml(
std::filesystem::path("original.eml"));
message.save(msg_path);
// MSG → EML
auto reloaded = aspose::email::foss::msg::mapi_message::from_file(msg_path);
reloaded.save_to_eml(eml_out);
std::cout << "Subject preserved: " << reloaded.subject() << '\n';
std::cout << "Attachments: " << reloaded.attachments().size() << '\n';
}Langkah 6 — Menukar kepada EML byte dalam memori
Kedua-dua save() dan save_to_eml() mempunyai overloads argumen nol yang kembali std::vector<std::uint8_t>, berguna untuk hasil streaming ke sambungan rangkaian atau Database tanpa menyentuh sistem fail:
#include <filesystem>
#include "aspose/email/foss/msg/mapi_message.hpp"
int main()
{
const auto message = aspose::email::foss::msg::mapi_message::load_from_eml(
std::filesystem::path("message.eml"));
// In-memory MSG bytes
const auto msg_bytes = message.save();
// In-memory EML bytes
const auto eml_bytes = message.save_to_eml();
}Isu Umum dan Penyelesaian
load_from_eml() yang mempunyai ciri-ciri yang sama dalam fail. Pastikan fail digunakan RFC 5322 CRLF baris akhir. EML fail yang dieksport oleh beberapa alat mungkin menggunakan LF telanjang. perpustakaan Menanti akhir garis yang memenuhi piawaian.
Perubahan yang berlaku selepas peralihan. Mengesahkan bahawa EML mengandungi standard MIME multipart/mixed atau multipart/related imej dalam talian. gambar yang di rujuk melalui cid: yang dihasilkan dalam bentuk bahan-bahan yang terdapat pada tempat tersebut dan hendaklah hadir.
HTML badan hilang selepas MSG → EML. Kandungan HTML disimpan melalui perjalanan bulat bila message.html_body() tidak boleh dibiarkan kosong. jika message.body() Ia telah dihuni di dalam Sumber MSG, EML akan mengandungi hanya sebahagian teks biasa.
save_to_eml() Pengeluaran stream ialah kosong. Open output stream dengan std::ios::binary.Aliran mod teks merosakkan struktur MIME pada Windows.
Subjek mengandungi ?= Menggunakan Artifacts. Ini ialah 2047 kata-kata yang dikodkan Perpustakaan ini telah disimpan dalam bentuk yang sama.Dekodkan dengan perpustakan RFC 2047 Jika anda memerlukan subjek Unicode yang mudah.
Soalan Lazim
Adakah lampiran disimpan dalam kedua-dua arah penukaran?
Kedua-dua pergerakan ini ialah di mana semua pengikat yang disusun oleh mapi_message Senarai lampiran. lampir binari diwakili sebagai bajet mentah dalam mapi_attachment::data.
Adakah EML → MSG menyimpan badan HTML?
Jika terdapat satu jenis EML yang mengandungi a text/html MIME bahagian, ia disimpan dalam MAPI HTML badan harta dan dikembalikan oleh message.html_body() Selepas pengecasan.
Bolehkah saya mengkonversi batch direktori fail EML?
Ya. Iterate direktori dengan std::filesystem::directory_iterator dan panggilan mapi_message::load_from_eml() Pada setiap .eml Jalan, kemudian selamatkan dengan save():
#include <filesystem>
#include "aspose/email/foss/msg/mapi_message.hpp"
int main()
{
for (const auto& entry : std::filesystem::directory_iterator("emails/"))
{
if (entry.path().extension() == ".eml")
{
auto msg = aspose::email::foss::msg::mapi_message::load_from_eml(entry.path());
auto out = entry.path();
out.replace_extension(".msg");
msg.save(out);
}
}
}Apa yang disimpan semasa EML ↔ MSG penukaran?
Subjek, badan teks biasa, HTML tubuh, nama penghantar dan alamat e-mel, senarai penerima, dan semua lampiran MIME. IMAP bendera, tajuk laluan di luar tajukan pengangkutan asas, serta data yang disenaraikan TNEF tidak disimpan.
ialah load_from_eml() Tindakan selamat?
Setiap panggilan kepada load_from_eml() Menciptakan sebuah kemerdekaan mapi_message Perkara ini. anda boleh memanggilnya daripada beberapa thread secara bersamaan selagi setiap thread menggunakan yang tersendiri Mesej objek.