EML och MSG konvertering
EML och MSG konvertering
Aspose.Email FOSS for C++ converts bidirectionally between EML (RFC 5322 / MIME) och MSG (Outlook MAPI) format som används för att mapi_message.Konversionsvägen är: load_from_eml() In-minnet i minnet mapi_message → save() för EML→MSG, och from_file() / from_stream() → save_to_eml() För MSG→EML.
Konvertera EML till MSG
Ladda upp en EML-fil med mapi_message::load_from_eml(),och sedan serialisera till MSG med save():
#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';
message.save(std::filesystem::path("converted.msg"));
std::cout << "Saved converted.msg\n";
}load_from_eml() Parsera MIME-strukturen och populerar MAPI-tema, platt text kropp, HTML-kropp, sändaridentitet, mottagarlista och alla bifogade delar.
Konvertera MSG till EML
Ladda upp en MSG-fil med mapi_message::from_file(),Och sedan ringer 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";
}Streambaserad konvertering
Alla fyra relevanta metoder accepteras std::istream / std::ostream Överbelastning för Pipeline-stil bearbetning utan att röra filsystemet:
#include <fstream>
#include <filesystem>
#include "aspose/email/foss/msg/mapi_message.hpp"
int main()
{
// EML → MSG via streams
std::ifstream eml_in("message.eml", std::ios::binary);
const auto message = aspose::email::foss::msg::mapi_message::load_from_eml(eml_in);
std::ofstream msg_out("converted.msg", std::ios::binary);
message.save(msg_out);
// MSG → EML via streams
std::ifstream msg_in("converted.msg", std::ios::binary);
const auto reloaded = aspose::email::foss::msg::mapi_message::from_stream(msg_in);
std::ofstream eml_out("roundtrip.eml", std::ios::binary);
reloaded.save_to_eml(eml_out);
}Alltid öppna strömmar med std::ios::binary.Text-mode strömmar översätta linjeändar på Windows, korrupta binära CFB-data.
In-Memory Conversion (Bytes) och in-minnet omvandlas till
save() och save_to_eml() Båda har nollargument överbelastning returnerar std::vector<std::uint8_t>.Använd dessa för att undvika alla filsystem I/O:
#include <filesystem>
#include <vector>
#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"));
const std::vector<std::uint8_t> msg_bytes = message.save();
const std::vector<std::uint8_t> eml_bytes = message.save_to_eml();
// Write to a database, network socket, or other destination...
}Batch Directory omvandling
Skriv ett katalog med std::filesystem::directory_iterator för att konvertera alla .eml Filer i ett pass:
#include <filesystem>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"
int main()
{
const std::filesystem::path input_dir("emails/eml");
const std::filesystem::path output_dir("emails/msg");
std::filesystem::create_directories(output_dir);
for (const auto& entry : std::filesystem::directory_iterator(input_dir))
{
if (entry.path().extension() != ".eml")
continue;
const auto message = aspose::email::foss::msg::mapi_message::load_from_eml(
entry.path());
auto out_path = output_dir / entry.path().filename();
out_path.replace_extension(".msg");
message.save(out_path);
std::cout << "Converted: " << entry.path().filename() << '\n';
}
}Tips och bästa praxis
- Öppna alla filströmmar med
std::ios::binaryBåde in och ut. - Prefer
load_from_eml(path)över ström överbelastning när du har en väg; vägen överbelastning hanterar filen öppnas intern och är något enklare. - Använd bytesöverlåtelser (
save()ochsave_to_eml()med inga arg) när data är kopplade till mellan tjänster för att undvika tillfälliga filer. - Subject, body, HTML-kropp, sändare, mottagare och MIME-filer bevaras alla genom den fullständiga rundturen.
- IMAP-flaggor, routinghuvud och TNEF-kodat innehåll transporteras inte genom konvertering.
Vanliga frågor
| Issue | Cause | Fixar |
|---|---|---|
load_from_eml Hämta på en giltig fil | icke-CRLF linjeändningar i EML | Säker EML använder RFC 5322 CRLF; vissa exportverktyg skriver bara LF |
| Saknade anslutningar efter EML → MSG | icke-standard MIME bifogade kodning | Kontrollera EML användning multipart/mixed med standard Content-Disposition: attachment |
| Vagt HTML-kropp efter MSG → EML | Källa MSG har bara en platt-text kropp | Check message.html_body();Om det är tomt, lagras endast tydlig text. |
| Strömproduktionen är korrupt | Stream öppnas i textläge | Aldrig använda std::ios::binary |
Subject visar ?= sekvenser | RFC 2047 kodad-ord i original EML | Decodera med en RFC 2047 bibliotek; biblioteket behåller kodad form |
FAQ
Försvårar EML → MSG HTML-kroppen?
Ja, A är text/html MIME-del lagras i MAPI HTML kroppsegenskapen och är tillgänglig via message.html_body() efter laddning.
Är anslutningar bevarade i båda riktningarna?
Alla MIME-fästdelar transporteras genom mapi_message Anslutningslista . Binära bilagor är tillgängliga som attachment.data (a) och std::vector<std::uint8_t>).
Kan jag konvertera en enda EML till flera utgångsformat samtidigt?
Ladda EML en gång med load_from_eml(),Och ringer båda save() och save_to_eml() på samma in-minnes mapi_message och objekt.
är load_from_eml() Trådsäkerhet ?
Varje samtal skapar en oberoende mapi_message Exempel: flera trådar kan ringa load_from_eml() samtidigt så länge varje tråd använder sitt eget utgångsobjekt.
Vad händer med meddelanden utan en platt text kropp?
Om EML endast innehåller en text/html del av, message.body() återställer en tom sträng och message.html_body() bär HTML-innehållet. båda bevaras via MSG Seriering av .
API Referens sammanfattning
| Klass / Metod | Beskrivning |
|---|---|
mapi_message::load_from_eml(path) | Delar en EML-fil i ett mapi_message |
mapi_message::load_from_eml(stream) | Parse EML från en std::istream |
mapi_message::save(path) | Serialize mapi_message Till en MSG-fil |
mapi_message::save(stream) | Skriv MSG bytes till en std::ostream |
mapi_message::save() | Återgå till MSG som std::vector<std::uint8_t> |
mapi_message::from_file(path) | Ladda upp en MSG-fil i ett mapi_message |
mapi_message::from_stream(stream) | Ladda MSG från en std::istream |
mapi_message::save_to_eml(path) | Skriv EML till en filvägen |
mapi_message::save_to_eml(stream) | Skriv EML bytes till en std::ostream |
mapi_message::save_to_eml() | Återgå till EML som std::vector<std::uint8_t> |