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.النص-وضع التدفقات ترجمة خط النهايات على ويندوز، وتفسير البيانات الثنائية CFB.


تحويل الذاكرة (Bytes)

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 MAPI ويمكن الوصول إليه. عبر message.html_body() بعد تحميلها .

هل يتم الحفاظ على الارتباطات في كلا الاتجاهين؟?

نعم جميع أجزاء MIME المرفقة يتم نقلها من خلال mapi_message قائمة الالتزام . بيانات الارتباط الثنائي متاحة كما 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() متنافسة طالما أن كل شريط يستخدم كائن الإنتاج الخاص به.

ماذا يحدث للرسائل التي لا يوجد فيها جسم نص مسطح؟?

إذا كان EML يحتوي على واحد فقط text/html الجزء , message.body() إرجاع شريط فارغ و message.html_body() يحمل محتوى HTML. كلاهما محمي من خلال MSG التعديلات .


إشارة API

الفئة / الطريقةوصف
mapi_message::load_from_eml(path)قم بتحويل ملف EML إلى A mapi_message
mapi_message::load_from_eml(stream)إملي من واحد std::istream
mapi_message::save(path)سلسلة mapi_message إلى ملف MSG
mapi_message::save(stream)إرسال رسالة MSG إلى std::ostream
mapi_message::save()عودة MSG ك std::vector<std::uint8_t>
mapi_message::from_file(path)تحميل ملف MSG إلى A 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>
 العربية