EML και MSG μετατροπή
EML και MSG μετατροπή
Aspose.Email FOSS for C++ converts bidirectionally between EML (RFC 5322 / MIME) και MSG (Outlook MAPI) μορφές που χρησιμοποιούν mapi_message.Ο δρόμος της μετατροπής είναι: load_from_eml() Μνήμη σε μνήμες mapi_message → save() για το EML → MSG, και from_file() / from_stream() → save_to_eml() Για το MSG → EML.
Μετατροπή EML σε MSG
Κατεβάστε ένα αρχείο EML με mapi_message::load_from_eml(),και μετά να το στείλουμε στο MSG με 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() διαλύει τη δομή του MIME και πληθυσμού το θέμα MAPI, κείμενο-πράσινο σώμα, σώματα HTML, ταυτότητα αποστολέα, λίστα παραλήπτη και όλα τα συνημμένα.
Μετατροπή MSG σε EML
Κατεβάστε ένα αρχείο MSG με mapi_message::from_file(),Στη συνέχεια καλέστε 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";
}Μετατροπή με βάση το ρεύμα
Οι τέσσερις σχετικές μεθόδους αποδέχονται std::istream / std::ostream Υπερφόρτωση για επεξεργασία τροφοδοσίας χωρίς να αγγίξει το σύστημα αρχείων:
#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);
}Πάντα ανοιχτά ρεύματα με std::ios::binary.Tex-mode Streams μεταφράζει τα τέρματα γραμμής Windows, διαφθορά των δεδομένων binary CFB.
Η μετατροπή της μνήμης (in-memory conversion)
save() και save_to_eml() Και οι δύο έχουν μηδενικό επιχείρημα επιστροφής std::vector<std::uint8_t>.Χρησιμοποιήστε αυτά για να αποφύγετε όλα τα συστήματα αρχείων 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
Εισάγετε ένα κατάλογο με std::filesystem::directory_iterator να μετατρέψουμε όλα .eml Τα αρχεία σε ένα πέρασμα:
#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';
}
}Συμβουλές και βέλτιστες πρακτικές
- Ανοίξτε όλες τις ροές αρχείων με
std::ios::binaryκαι εισαγωγών και εξόδου. - Προτιμώ
load_from_eml(path)πάνω από το ρεύμα υπερφόρτωση όταν έχετε ένα μονοπάτι. υπερφόρτωση χειρίζεται το άνοιγμα αρχείου εσωτερικά και είναι ελαφρώς απλούστερη. - Χρησιμοποιήστε τα μπάτια υπερφόρτωσης (
save()καιsave_to_eml()χωρίς αμφιβολίες) όταν τα δεδομένα μεταξύ των υπηρεσιών για την αποφυγή προσωρινών αρχείων. - Το θέμα, το σώμα, ο οργανισμός HTML, οι αποστολείς, τα παραλήπτες και τα προσθέματα MIME διατηρούνται όλα μέσα από την πλήρη περιήγηση.
- Τα σημαία του IMAP, οι επικεφαλίδες διαδρομής και το κρυπτογραφημένο περιεχόμενο TNEF δεν μεταφέρονται μέσω της μετάβασης.
κοινά ζητήματα
| Θέμα | Αιτία | ΦΙΛΕΞΗ |
|---|---|---|
load_from_eml Στελίζει σε ένα έγκυρο αρχείο | Μη-CRLF γραμμές τελειών σε EML | Εγγυηθείτε EML χρησιμοποιεί RFC 5322 CRLF. μερικά εργαλεία εξαγωγής γράφουν απλά LF |
| Απεβίβαση των συνημμένων μετά EML → MSG | Μη τυποποιημένη MIME κρυπτογράφηση προσθήκης | Ελέγξτε τη χρήση EML multipart/mixed Με τα πρότυπα Content-Disposition: attachment |
| Αδειοί HTML σώματα μετά MSG → EML | Η MSG έχει μόνο ένα σώμα κειμένου | Ελέγξτε message.html_body();· αν είναι κενό, αποθηκεύεται μόνο ο καθαρός κείμενο |
| Η παραγωγή του ρεύματος είναι διαφθορά | Ανοίγει το κείμενο σε λειτουργία | Πάντα χρησιμοποιείτε std::ios::binary |
ΣΤΟΜΑ ΔΕΙΧΝΗΣΕΙΣ ?= Εξάμηνο | RFC 2047 κωδικοποιημένο λέξη σε πρωτότυπο EML | Αποκρυπτογραφημένη με βιβλιοθήκη RFC 2047· η βιβλία διατηρεί την κρυμμένη μορφή |
FAQ
Το EML → MSG διατηρεί το σώμα HTML;?
Ναι Α text/html Το μέρος MIME αποθηκεύεται στην ιδιοκτησία του σώματος HTML και είναι προσβάσιμο μέσω message.html_body() Μετά την φόρτιση.
Τα ελαστικά διατηρούνται και στις δύο κατευθύνσεις;?
Ναι. Όλα τα τμήματα MIME συνημμένα μεταφέρονται μέσω της mapi_message Λίστα προσκόλλων. Τα δεδομένα binary attachment είναι διαθέσιμα ως attachment.data (α) Α std::vector<std::uint8_t>).
Μπορώ να μετατρέψω ένα ενιαίο EML σε πολλαπλές μορφές εξόδου ταυτόχρονα;?
Ναι. Κατεβάστε το EML μία φορά με load_from_eml(),καλέστε και τα δύο save() και save_to_eml() Με την ίδια μνήμη mapi_message αντικειμένου .
Είναι load_from_eml() Υπεύθυνος ίχνος;?
Κάθε κλήση δημιουργεί μια ανεξάρτητη mapi_message ΕΠΙΤΡΟΦΗ: Πολλαπλές κλήσεις μπορούν να καλέσουν load_from_eml() Συγκρίνουσα, όσο κάθε thread χρησιμοποιεί το δικό του αντικείμενο παραγωγής.
Τι συμβαίνει με μηνύματα χωρίς σώμα κειμένου;?
Αν το EML περιέχει μόνο ένα text/html μέρος της, message.body() Επιστρέφει ένα κενό ρεύμα και message.html_body() Το περιεχόμενο του HTML διατηρείται και από το MSG. Η Σειρά.
Συνοπτική αναφορά API
| Κλάση / Μέθοδος | Περιγραφή |
|---|---|
mapi_message::load_from_eml(path) | Διαχωρίστε ένα αρχείο EML σε ένα mapi_message |
mapi_message::load_from_eml(stream) | Η EML από ένα std::istream |
mapi_message::save(path) | Σειρά mapi_message Για να κάνετε ένα αρχείο MSG |
mapi_message::save(stream) | Γράψτε το Μπάτσε σε ένα std::ostream |
mapi_message::save() | Επιστροφή MSG ως std::vector<std::uint8_t> |
mapi_message::from_file(path) | Κατεβάστε ένα αρχείο MSG σε ένα mapi_message |
mapi_message::from_stream(stream) | Εισαγωγή MSG από ένα std::istream |
mapi_message::save_to_eml(path) | Γράψτε EML σε ένα αρχείο διαδρομή |
mapi_message::save_to_eml(stream) | Γράψτε τα μπάτια EML σε ένα std::ostream |
mapi_message::save_to_eml() | Επιστροφή EML ως std::vector<std::uint8_t> |