Como ler arquivos em C++

Como ler arquivos em C++

Aspose.Email FOSS for C++ lets you open and parse Outlook MSG files with a single Função de chamada. mapi_message::from_file() e mapi_message::from_stream() Carregar o mensagem completa – sujeito, corpo, remetente, receptor e anexos – em uma memória interna. Não há dependência de Outlook ou COM.

Passo 1 – Crie o projeto

Clone o repositório e adicione-o ao seu 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)

Passo 2 – Inclua o Header

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

Este único header fornece mapi_message Todos os tipos de apoio na aspose::email::foss::msg Nome do Espaço.


Passo 3 – Carregar uma mensagem de um caminho de arquivo

Usar mapi_message::from_file() Quando você tem uma 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';
}

Passo 4 – Carregar uma mensagem de um Stream

Usar mapi_message::from_stream() Para se separar de qualquer std::istream - Útil para Processamento de dados recebidos através de uma rede ou a partir de um buffer em memória:

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

Sempre abra o fluxo com std::ios::binary Para evitar o fim de linha do Windows Transformação do contêiner CFB.


Passo 5 – Iterar os receptores

message.recipients() Retorno a std::vector dos objetos receptores, cada um com display_name, email_address,e recipient_type Os campos:

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

Passo 6 – Iterar anexos

message.attachments() Voltar a std::vector de objetos de fixação. cada anexo Exposição filename, mime_type, data (Os Bichos de Riba), content_id,E o is_embedded_message() Pregão :

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

Problemas Comuns e Soluções

Vazio body() Após o carregamento. Algumas mensagens armazenam texto apenas no corpo HTML Propriedade - Verifique message.html_body() Quando message.body() Retorna uma cadeia vazia.

O canal foi aberto sem std::ios::binary. No Windows, fluxos de texto traduzem Sequências de CRLF, corrompendo silenciosamente dados CFB binários. Sempre abra arquivos com std::ios::binary.

msg_exception lançado para um arquivo de aparência válida. Verifique se o arquivo é genuíno MSG (OLE Compound File).Os arquivos salvos por algumas ferramentas de exportação podem ser texto simples ou MIME e Não pode ser parcelado por mapi_message::from_file().

recipients() Retorna um vetor vazio. arquivos mais antigos, às vezes omitem o destinatário A tabela, mas os receptores de exibição da loja na display_to Acesso a: acessar através do message.get_property_value() com common_message_property_id::display_to e property_type_code::ptyp_string.

Grande quantidade de dados na memória. Omapi_message::from_file() e from_stream() carregue toda a mensagem, incluindo todos os bytes de anexo. Para arquivos grandes, abra o Conteúdo de container com msg_reader e inspeccione os fluxos de ligação sem ser completamente materializando as mesmas.

Perguntas Frequentes

Qual é a diferença entre from_file() e from_stream()?

Ambos produzem um mesmo mapi_message Objeto de . from_file() Aceita a std::filesystem::path Abra o arquivo internamente. from_stream() Leia de qualquer std::istream fornecidos – útil quando os dados MSG já estão na memória ou Chegando em um socket.

Faz from_file() Deixar o arquivo aberto após a carga?

O arquivo é aberto, completamente analisado na memória e fechado antes de ser enviado. from_file() Você pode mover ou excluir o arquivo de origem imediatamente após a chamada.

Posso ler arquivos criados pelo Outlook no macOS ou Linux?

Sim. O formato MSG (propriedades de arquivo composto + MAPI) é portátil em todos os formatos. Sistemas operacionais. qualquer .msg O arquivo produzido por qualquer versão do Outlook pode ser aberto. com mapi_message::from_file().

Como ler o corpo HTML?

Chamem message.html_body().Se a mensagem foi criada com apenas um corpo de texto simples, Retorna uma cadeia vazia. message.body() Retorna o corpo de texto simples.

O estritamente modesto é o padrão?

mapi_message::from_file(path, strict) e from_stream(stream, strict) Aceite um Opcionalidade strict Boolean. o defeito é false,que toleram a menor estruturação desvios em arquivos do mundo real MSG.

Veja também

 Português