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_messagesave() για το 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>
 Ελληνικά