EML'yi MSG'ye C++'da Nasıl Dönüştürülür?

EML'yi MSG'ye C++'da Nasıl Dönüştürülür?

Aspose.Email FOSS for C++ supports bidirectional conversion between EML (RFC 5322 / MIME ve MSG (Outlook MAPI) biçimleri. mapi_message::load_from_eml() İthalat için bir EML dosyası, sonra mapi_message::save() MSG olarak yazmak - ve tersine mapi_message::from_file() takip edenler tarafından mapi_message::save_to_eml().

Adım 1 - Projeyi Kurun

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)

Adım 2 – EML MSG (File Path) dönüştürmek

mapi_message::load_from_eml() EML dosyasını parsa ve özelliklerini ortaya çıkarır. Standartı mapi_message İletişim - Call save() sonuçları MSG olarak yazmak için:

#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';
    std::cout << "From:    " << message.sender_email_address() << '\n';

    message.save(std::filesystem::path("converted.msg"));
    std::cout << "Saved converted.msg\n";
}

Adım 3 – EML’yi MSG (Stream) olarak dönüştürmek

Üstü akışın kullanımı load_from_eml() EML verileri bir ağdan geldiğinde Sohbet, hafıza buffer veya başka bir şey std::istream:

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

int main()
{
    std::ifstream eml_stream("message.eml", std::ios::binary);
    const auto message = aspose::email::foss::msg::mapi_message::load_from_eml(eml_stream);

    message.save(std::filesystem::path("converted.msg"));
}

Adım 4 - MSG’yi EML’ye dönüştürmek

Mevcut MSG dosyalarını yükleme mapi_message::from_file(),sonra EML’ye serialize edin format ile 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";
}

5. Adım: Tam Çerçeve (EML → MSG → EML)

Aşağıdaki örnek, nesnenin, bedenin ve gönderenin tüm alıcıların ve eklentilerin tam bir yuvarlak yolculukla korunduğunu göstermektedir:

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

int main()
{
    const auto msg_path = std::filesystem::path("roundtrip.msg");
    const auto eml_out  = std::filesystem::path("roundtrip.eml");

    // EML → MSG
    auto message = aspose::email::foss::msg::mapi_message::load_from_eml(
        std::filesystem::path("original.eml"));
    message.save(msg_path);

    // MSG → EML
    auto reloaded = aspose::email::foss::msg::mapi_message::from_file(msg_path);
    reloaded.save_to_eml(eml_out);

    std::cout << "Subject preserved: " << reloaded.subject() << '\n';
    std::cout << "Attachments: " << reloaded.attachments().size() << '\n';
}

Adım 6 - EML Bytes’i hafızaya dönüştürmek

İkisi de save() ve save_to_eml() 0’dan fazla argüman olan geri dönüşü std::vector<std::uint8_t>, bir ağ bağlantısına aktarma sonuçları için yararlı veya Dosya sistemine dokunmadan veritabanı:

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

    // In-memory MSG bytes
    const auto msg_bytes = message.save();

    // In-memory EML bytes
    const auto eml_bytes = message.save_to_eml();
}

Yaygın Sorunlar ve Çözümler

load_from_eml() Geçerli görünen bir EML dosyasına atılır. Dosya RFC 5322 kullanır. CRLF hattı bitkileri. bazı araçlar tarafından ihraç edilen EML dosyaları sadece LF kullanabilir. Standart uyumlu çizgi bitkiler bekleniyor.

EML → MSG dönüşümünden sonra eksik eklentiler. EML standart içerir. MIME multipart/mixed veya multipart/related İsimler: Inline resimler referans yolda cid: MSG’de bir eklenti olarak taşındı ve mevcut olmalıdır.

HTML vücudu MSG → EML’den sonra kayboldu. HTML içeriği yuvarlak yolculuk aracılığıyla korunur Ne zaman message.html_body() boşlukta değilse, sadece message.body() Halkın içinde yer alan kaynak MSG, EML sadece düz metin bir kısmı içerecektir.

save_to_eml() Akış çıkışı boş. Açık çıkış akışı ile std::ios::binary. metin modu akışları Windows’ta MIME yapısını bozuyor.

Konu içerir ?= Artifakları kodlayın. RFC 2047 kodlanmış kelime sıraları Orijinal EML’de Kütüphane onları korur. RFC 2047 kütüphanesi ile dekore edilir Unicode konusuna ihtiyacınız varsa.

Sık Sorulan Sorular

Her iki yönde de dönüşüm yapılır mı?

Evet. hem EML → MSG ve MSM → EMM dönüşümleri tüm MIME eklentileri aracılığıyla taşıyor mapi_message Binary attachments (binary eklentiler) çamur byte olarak temsil edilir. mapi_attachment::data.

EML → MSG HTML vücudunu korur mu?

Evet. eğer EML bir text/html MIME parçası, MAPI HTML vücudunda kaydedilir. Mülkiyet ve geri dönüş message.html_body() Yükleme sonrası.

EML dosyalarının bir dizinini batch-convert edebilir miyim?

Evet. dizinle birlikte std::filesystem::directory_iterator ve çağrı mapi_message::load_from_eml() Her birinde .eml yol, sonra kurtarma ile save():

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

int main()
{
    for (const auto& entry : std::filesystem::directory_iterator("emails/"))
    {
        if (entry.path().extension() == ".eml")
        {
            auto msg = aspose::email::foss::msg::mapi_message::load_from_eml(entry.path());
            auto out = entry.path();
            out.replace_extension(".msg");
            msg.save(out);
        }
    }
}

EML ↔ MSG dönüşümünde ne saklanır?

Konu, düz metin vücudu, HTML vücut, gönderen adı ve e-posta adresi, alıcı listesi ve tüm MIME eklentileri. IMAP bayrakları, temel ulaşım başlıklarının ötesinde yönlendirme başlığı ve TNEF kodlanmış veriler korunmaz.

O da load_from_eml() Trayum güvenli mi?

Her çağrı için load_from_eml() Bağımsız bir yapı oluşturur mapi_message Örnek - Sen Birden fazla çubuktan aynı anda çağrılabilir, her çubuğun kendi kullanımı olduğu sürece. Mesaj konusu.

Ayrıca bakın

 Türkçe