Làm thế nào để đọc MSG tập tin trong C++

Làm thế nào để đọc MSG tập tin trong C++

Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single chức năng gọi. mapi_message::from_file()mapi_message::from_stream() tải các toàn bộ thông điệp – chủ đề, cơ thể, người gửi, nhận và các phần phụ thuộc – vào một trong những ký ức Không có tùy thuộc Outlook hoặc COM.

Bước 1 - Thiết lập dự án

Clone repository và thêm vào bạn 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)

Bước 2 - Nhập đầu

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

Mục tiêu này cung cấp một mapi_message và tất cả các loại hỗ trợ trong aspose::email::foss::msg Tên miền.


Bước 3 - Tải một tin nhắn từ một đường file

Sử dụng mapi_message::from_file() Khi bạn có một 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';
}

Bước 4 - Tải một tin nhắn từ dòng chảy

Sử dụng mapi_message::from_stream() để chia sẻ từ bất kỳ std::istream - hữu ích cho xử lý MSG dữ liệu được nhận qua một mạng hoặc từ một buffer trong bộ nhớ:

#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';
}

Luôn mở dòng với std::ios::binary Để ngăn chặn Windows line-end dịch từ phá hủy container CFB.


Bước 5 - Thuốc Iterate

message.recipients() Trở lại a std::vector Đối với các đối tượng nhận, mỗi đối display_name, email_address, và recipient_type Các lĩnh vực:

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';
}

}


---

## Bước 6 - Iterate Attachments

`message.attachments()` Trở lại a `std::vector` - Các vật dụng liên kết. mỗi vật liệu liên quan triển lãm `filename`, `mime_type`, `data` (Những cái bút thô), `content_id`,Và The `is_embedded_message()` Khải Huyền:

    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';
    }
}

Các vấn đề chung và Fixes

Empty body() sau khi tải. Một số tin nhắn chỉ lưu trữ văn bản trong cơ thể HTML Tài sản - Check message.html_body() Khi nào message.body() Lại lấy lại một dòng trống.

Stream mở mà không có std::ios::binary. Trên Windows, dòng văn bản-mode dịch CRLF theo dõi, im lặng phá hủy dữ liệu CFB nhị phân. Luôn mở MSG tập tin với std::ios::binary.

msg_exception Đã ném cho một tệp có dạng xem hợp lệ. Kiểm tra xem file là một MSG thực sự Các tập tin được lưu bởi một số công cụ xuất khẩu có thể là văn bản thẳng hoặc MIME và Không thể được phân phối bởi mapi_message::from_file().

recipients() Lấy lại một vector trống. Old MSG file đôi khi bỏ qua người nhận bảng nhưng store hiển thị người nhận trong display_to MAPI tài sản. truy cập nó qua message.get_property_value() Với common_message_property_id::display_toproperty_type_code::ptyp_string.

Dữ liệu gắn kết lớn trong bộ nhớ. Đang xemmapi_message::from_file()from_stream() tải toàn bộ thông điệp bao gồm tất cả các byte gắn. cho tệp lớn, mở container với msg_reader và kiểm tra dòng nối kết mà không hoàn toàn vật chất hóa chúng.

Thường xuyên hỏi câu hỏi

Sự khác biệt giữa from_file()from_stream()?

Cả hai đều tạo ra một tương tự. mapi_message đối tượng. from_file() chấp nhận a std::filesystem::path Mở file nội bộ. from_stream() Đọc từ bất kỳ std::istream bạn cung cấp – hữu ích khi dữ liệu MSG đã được ghi nhớ hoặc Đến trên một chiếc socket.

Does from_file() giữ file mở sau khi tải lên?

Không. tệp được mở, hoàn toàn vẽ vào bộ nhớ và đóng trước khi from_file() Bạn có thể di chuyển hoặc xóa tệp nguồn ngay sau khi gọi.

Tôi có thể đọc các tệp được tạo bởi Outlook trên macOS hoặc Linux không?

Có. định dạng MSG (OLE Compound File + MAPI thuộc tính) có thể di chuyển qua Hệ điều hành: bất kỳ .msg Tệp được tạo ra bởi bất kỳ phiên bản nào của Outlook có thể mở Với mapi_message::from_file().

Làm thế nào để đọc cơ thể HTML?

Call message.html_body().Nếu thông điệp được tạo ra chỉ với một cơ thể văn bản thẳng, Nó mang lại một dòng trống. message.body() Trở lại cơ thể văn bản thẳng.

Mối độ nghiêm ngặt là default?

mapi_message::from_file(path, strict)from_stream(stream, strict) chấp nhận một tùy chọn strict @BayLong: Lời bài hát: The Default Is false,- Tối dung lượng cấu trúc nhỏ hơn Các biến dạng trong các tệp thế giới thực MSG.

See Also

 Tiếng Việt