Πώς να διαβάσετε τα αρχεία MSG στο C++

Πώς να διαβάσετε τα αρχεία MSG στο C++

Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single Η λειτουργία κλήσης. mapi_message::from_file() και mapi_message::from_stream() Κατεβάστε το πλήρης μήνυμα — αντικείμενο, σώμα, αποστολέας, παραλήπτες και προσθήκες — σε μια μνήμη Το αντικείμενο δεν έχει εξάρτηση από το Outlook ή COM.

Βήμα 1 - Εισάγετε το έργο

Κλωνοποιήστε το αποθεματικό και προσθέστε στο δικό σας CMakeLists.txt:

git clone https://github.com/aspose-email-foss/Aspose.Email-FOSS-for-Cpp.git
add_subdirectory(Aspose.Email-FOSS-for-Cpp)
target_link_libraries(your_target PRIVATE AsposeEmailFoss::AsposeEmailFoss)

Βήμα 2 - Εισάγετε το κεφάλαιο

#include "aspose/email/foss/msg/mapi_message.hpp"

Ο ενιαίος τίτλος παρέχει mapi_message Όλοι οι υποστηρικτές στην aspose::email::foss::msg Ονομαστικό χώρο.


Βήμα 3 - Κατεβάστε ένα μήνυμα από μια διαδρομή αρχείου

Χρησιμοποιήστε mapi_message::from_file() Όταν έχετε ένα std::filesystem::path:

#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"));

    std::cout << "Subject: " << message.subject() << '\n';
    std::cout << "From:    " << message.sender_name()
              << " <" << message.sender_email_address() << ">\n";
    std::cout << "Body:    " << message.body() << '\n';
}

Βήμα 4 - Κατεβάστε ένα μήνυμα από μια ροή

Χρησιμοποιήστε mapi_message::from_stream() Να ξεφύγει από οποιαδήποτε std::istream - Χρήσιμο για επεξεργασία δεδομένων MSG που λαμβάνονται μέσω δικτύου ή από ένα μνήμα-επιβραστή:

#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    std::cout << "Subject: " << message.subject() << '\n';
}

Πάντα ανοίξτε το ρεύμα με std::ios::binary Αποτροπή των Windows Line-End μεταφράσεις από την διαφθορά του εμπορευματοκιβωτίου CFB.


Βήμα 5 - Ιτεράτα Απορροφήματα

message.recipients() Επιστρέφει ο Α std::vector από τα αντικείμενα που λαμβάνουν, κάθε ένα με το display_name, email_address,και recipient_type Τα πεδία:

#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    for (std::size_t i = 0; i < message.recipients().size(); ++i)
    {
        const auto& r = message.recipients()[i];
        std::cout << "[" << (i + 1) << "] "
                  << r.display_name << " <" << r.email_address << ">"
                  << " type=" << r.recipient_type << '\n';
    }
}

Βήμα 6 - Ιτεράτα Αλληλεπιδράσεις

message.attachments() Επιστρέφει ο Α std::vector Συσκευές: Κάθε προσάρτηση ΕΚΔΗΛΩΣΕΙΣ filename, mime_type, data (Οι ξηροί μύθοι), content_id,Και η is_embedded_message() Προηγούμενο :

#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"

int main()
{
    std::ifstream input("sample.msg", std::ios::binary);
    auto message = aspose::email::foss::msg::mapi_message::from_stream(input);

    for (std::size_t i = 0; i < message.attachments().size(); ++i)
    {
        const auto& a = message.attachments()[i];
        std::cout << "[" << (i + 1) << "] "
                  << a.filename << "  mime=" << a.mime_type
                  << "  bytes=" << a.data.size()
                  << "  embedded=" << (a.is_embedded_message() ? "yes" : "no")
                  << '\n';
    }
}

Κοινά προβλήματα και τακτοποιήσεις

Αδειά body() Μετά την φόρτιση. Μερικά μηνύματα αποθηκεύουν κείμενο μόνο στο σώμα HTML Ιδιοκτησία - Ελέγξτε message.html_body() Όταν message.body() Επιστρέφει μια κενή γραμμή.

Το ρεύμα ανοίγει χωρίς std::ios::binary. Στα Windows, μεταφράζονται τα κείμενα-μετρητά CRLF ακολουθίες, σιωπηλά διαφθορά δεδομένα binary CFB. Πάντα ανοίξτε τα αρχεία MSG με std::ios::binary.

msg_exception Σκοτώθηκε για ένα έγκυρο αρχείο. Ελέγξτε το αρχείο είναι ένα πραγματικό MSG Τα αρχεία που αποθηκεύονται από ορισμένα εργαλεία εξαγωγής μπορεί να είναι κείμενο ή MIME και Δεν μπορεί να διαλυθεί από mapi_message::from_file().

recipients() Επέστρεψε ένα κενό vector. Τα αρχεία MSG μερικές φορές παραλείπουν τον αποδέκτη Ετικέτες: Σελίδα, αλλά αποθήκη εμφανίζει τους παραλήπτες στο display_to Διάθεση με το MAPI.Access it via message.get_property_value() Με common_message_property_id::display_to και property_type_code::ptyp_string.

Μεγάλα δεδομένα προσθήκης στη μνήμη. ΟΙ ΠΡΟΣΟΧΕΣmapi_message::from_file() και from_stream() φορτώστε ολόκληρο το μήνυμα, συμπεριλαμβανομένων όλων των bytes προσθήκης. για μεγάλα αρχεία, ανοίξτε την Το υποκείμενο με msg_reader και να ελέγξει τις ροές προσθήκης χωρίς πλήρη να τους υλοποιήσουν.

Συχνές ερωτήσεις

Ποια είναι η διαφορά μεταξύ from_file() και from_stream()?

Και οι δύο παράγουν το ίδιο mapi_message αντικειμένου . from_file() Αποδέχεται το A std::filesystem::path Ανοίγει το αρχείο εσωτερικά. from_stream() Διαβάστε από Οποιοδήποτε std::istream παρέχετε – χρήσιμο όταν τα δεδομένα MSG είναι ήδη στη μνήμη ή Πέρασε πάνω από ένα σούπερ.

Η ΚΕ from_file() Ανοίξτε το αρχείο μετά την φόρτιση;?

Το αρχείο ανοίγει, διαχωρίζεται πλήρως στη μνήμη και κλείνει πριν από την έναρξη της from_file() Μπορείτε να μετακινήσετε ή να διαγράψετε το αρχείο πηγής αμέσως μετά την κλήση.

Μπορώ να διαβάσω τα αρχεία MSG που δημιουργήθηκε από το Outlook στο macOS ή Linux;?

Το MSG (OLE Compound File + MAPI) είναι φορητό σε όλο το δίκτυο. Συστήματα λειτουργίας: Οποιοδήποτε .msg Τα αρχεία που παράγονται από οποιαδήποτε έκδοση του Outlook μπορούν να ανοίξουν Με mapi_message::from_file().

Πώς διαβάζω το σώμα HTML;?

Κλήση message.html_body().Αν το μήνυμα δημιουργήθηκε μόνο με ένα κείμενο, Αυτό επιστρέφει μια κενή γραμμή. message.body() Επιστρέφει το κείμενο του σώματος.

Είναι η αυστηρή λειτουργία το default;?

mapi_message::from_file(path, strict) και from_stream(stream, strict) Αποδέχεται ένα Εναλλακτικά strict Μπόλερ: Η παραίτηση είναι false,που είναι ανεκτικές σε μικρές δομικές Διαφορές σε πραγματικό κόσμο αρχεία MSG.

Δείτε επίσης

 Ελληνικά