MSG फ़ाइलें पढ़ना
MSG फ़ाइलें पढ़ना
mapi_message Outlook MSG फ़ाइलों को लोड और पार्स करने के लिए प्रवेश बिंदु है। from_file() या from_stream() को एक ही कॉल से पूरा CFB कंटेनर पढ़ा जाता है, सभी MAPI प्रॉपर्टीज़ निकाली जाती हैं, और उन्हें टाइप्ड एक्सेसर मेथड्स के माध्यम से एक्सपोज़ किया जाता है — Outlook इंस्टॉलेशन की आवश्यकता नहीं।
फ़ाइल पथ से लोड करें
एक std::filesystem::path के साथ mapi_message::from_file() का उपयोग करें:
#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';
}स्ट्रीम से लोड करें
जब MSG डेटा नेटवर्क सॉकेट, एक आर्काइव, या किसी भी std::istream से आता है, तो mapi_message::from_stream() का उपयोग करें:
#include <fstream>
#include <iostream>
#include "aspose/email/foss/msg/mapi_message.hpp"
int main()
{
std::ifstream input("sample.msg", std::ios::binary);
const auto message = aspose::email::foss::msg::mapi_message::from_stream(input);
std::cout << "Subject: " << message.subject() << '\n';
}स्ट्रीम को हमेशा std::ios::binary के साथ खोलें। टेक्स्ट- मोड स्ट्रीम्स विंडोज़ पर लाइन एंडिंग्स को ट्रांसलेट करते हैं और CFB कंटेनर को भ्रष्ट कर देते हैं।
संदेश गुणों तक पहुँचें
mapi_message सबसे सामान्य संदेश गुणों को नामित गेटर्स के रूप में उजागर करता है:
#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"));
// Core properties
std::cout << "Subject: " << message.subject() << '\n';
std::cout << "Sender name: " << message.sender_name() << '\n';
std::cout << "Sender email: " << message.sender_email_address() << '\n';
std::cout << "Internet msg-id: " << message.internet_message_id() << '\n';
std::cout << "Message class: " << message.message_class() << '\n';
// Body — check html_body() first; fall back to plain body()
const auto& body = message.html_body().empty()
? message.body()
: message.html_body();
std::cout << "Body length: " << body.size() << " chars\n";
}प्राप्तकर्ताओं को इटरेट करें
message.recipients() प्राप्तकर्ता वस्तुओं का std::vector लौटाता है जिसमें display_name, email_address, और recipient_type होते हैं:
#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"));
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';
}
}संलग्नकों को इटरेट करें
message.attachments() संलग्नक वस्तुओं का std::vector लौटाता है। प्रत्येक filename, mime_type, data, content_id, और is_embedded_message() उजागर करता है:
#include <filesystem>
#include <fstream>
#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"));
for (const auto& a : message.attachments())
{
std::cout << a.filename
<< " " << a.mime_type
<< " " << a.data.size() << " bytes"
<< " embedded=" << (a.is_embedded_message() ? "yes" : "no")
<< '\n';
if (!a.is_embedded_message())
{
std::ofstream out("extracted_" + a.filename, std::ios::binary);
out.write(reinterpret_cast<const char*>(a.data.data()),
static_cast<std::streamsize>(a.data.size()));
}
}
}एम्बेडेड संदेशों तक पहुँचें
जब is_embedded_message() true हो, तो संलग्नक में एक अन्य MSG फ़ाइल होती है। इसे attachment.embedded_message के माध्यम से एक्सेस करें:
#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"));
for (const auto& a : message.attachments())
{
if (a.is_embedded_message() && a.embedded_message != nullptr)
{
const auto& inner = *a.embedded_message;
std::cout << "Embedded subject: " << inner.subject() << '\n';
inner.save(std::filesystem::path("embedded.msg"));
}
}
}टिप्स और सर्वोत्तम प्रथाएँ
- MSG फ़ाइलें लोड करते समय हमेशा
std::ios::binaryकोstd::ifstreamमें पास करें। html_body()कोbody()से पहले जांचें — HTML-केवल संदेश अपनी सामग्री HTML बॉडी प्रॉपर्टी में संग्रहीत करते हैं औरbody()को खाली छोड़ देते हैं।from_file()सभी अटैचमेंट डेटा को मेमोरी में लोड करता है। बड़े MSG फ़ाइलों के लिए,msg_readerके साथ अंतर्निहित कंटेनर खोलने पर विचार करें ताकि मेटाडेटा की जाँच की जा सके बिना अटैचमेंट बाइट्स को पूरी तरह से मैटेरियलाइज़ किए।from_file(path, strict)औरfrom_stream(stream, strict)काstrictपैरामीटर डिफ़ॉल्ट रूप सेfalseपर सेट होता है, वास्तविक-जगत MSG फ़ाइलों में छोटे संरचनात्मक विचलनों को सहन करता है।- प्राप्तकर्ता ऑब्जेक्ट्स
recipient_typeको उजागर करते हैं ताकि To, Cc, और Bcc प्रविष्टियों में अंतर किया जा सके।
सामान्य समस्याएँ
| समस्या | कारण | समाधान |
|---|---|---|
msg_exception वैध दिखने वाली फ़ाइल पर | फ़ाइल एक वास्तविक OLE CFB कंटेनर नहीं है | cfb_reader::from_file() के साथ सत्यापित करें — यदि यह भी त्रुटि देता है, तो फ़ाइल वैध MSG नहीं है |
body() रिक्त स्ट्रिंग लौटाता है | संदेश केवल HTML बॉडी का उपयोग करता है | इसके बजाय html_body() का उपयोग करें |
recipients() खाली है | प्राप्तकर्ता तालिका के बिना पुराना MSG | common_message_property_id::display_to के साथ get_property_value() के माध्यम से display_to तक पहुँचें |
| Windows पर स्ट्रीम भ्रष्टाचार | std::ios::binary के बिना स्ट्रीम खोला गया | std::ifstream में std::ios::binary फ़्लैग जोड़ें |
| बड़ी फ़ाइलों के लिए उच्च मेमोरी उपयोग | सभी अटैचमेंट डेटा पहले ही लोड किया जाता है | पूर्ण सामग्रीकरण के बिना लो-लेवल एक्सेस के लिए msg_reader उपयोग करें |
FAQ
क्या from_file() फ़ाइल हैंडल को खुला रखता है?
नहीं। फ़ाइल को खोला जाता है, पूरी तरह पार्स किया जाता है, और मेथड रिटर्न होने से पहले बंद कर दिया जाता है। कॉल के बाद आप स्रोत फ़ाइल को स्थानांतरित या हटा सकते हैं।
मैं कैसे पता करूँ कि अटैचमेंट फ़ाइल है या एम्बेडेड MSG?
कॉल करें attachment.is_embedded_message()। एम्बेडेड MSG फ़ाइलों के लिए true रिटर्न करता है; सामान्य फ़ाइल अटैचमेंट्स के लिए false। एम्बेडेड संदेशों के लिए, नेस्टेड ऑब्जेक्ट तक attachment.embedded_message के माध्यम से पहुँचें।
from_file() और msg_reader का उपयोग करने में क्या अंतर है?
mapi_message::from_file() उच्च-स्तरीय API है — यह पूर्ण संदेश को पार्स करता है और प्रॉपर्टीज़ को टाइप्ड फ़ील्ड्स के रूप में एक्सपोज़ करता है। msg_reader लो-लेवल रीडर है जो रॉ CFB कंटेनर स्ट्रक्चर तक पहुँच प्रदान करता है और तब उपयोगी होता है जब आपको सभी MAPI प्रॉपर्टीज़ को पार्स किए बिना संदेश लेआउट की जाँच करनी हो।
क्या Unicode और ANSI MSG फ़ाइलें दोनों समर्थित हैं?
हाँ। mapi_message Unicode (प्रॉपर्टी टाइप ptyp_string) और ANSI (ptyp_string8) स्ट्रिंग प्रॉपर्टीज़ दोनों को संभालता है। unicode_strings() Unicode प्रॉपर्टीज़ के साथ संग्रहीत संदेशों के लिए true रिटर्न करता है।
API Reference सारांश
| क्लास / मेथड | विवरण |
|---|---|
mapi_message::from_file(path) | एक std::filesystem::path से MSG फ़ाइल लोड करें |
mapi_message::from_file(path, strict) | स्ट्रिक्ट मोड विकल्प के साथ लोड करें |
mapi_message::from_stream(stream) | एक std::istream से MSG लोड करें |
mapi_message::from_stream(stream, strict) | स्ट्रीम से स्ट्रिक्ट मोड विकल्प के साथ लोड करें |
mapi_message::subject() | संदेश विषय स्ट्रिंग लौटाएँ |
mapi_message::body() | सादा-टेक्स्ट बॉडी लौटाएँ |
mapi_message::html_body() | HTML बॉडी लौटाएँ (यदि मौजूद न हो तो खाली) |
mapi_message::sender_name() | प्रेषक डिस्प्ले नाम लौटाएँ |
mapi_message::sender_email_address() | प्रेषक का ईमेल पता लौटाएँ |
mapi_message::internet_message_id() | RFC 2822 Message-ID हेडर लौटाएँ |
mapi_message::message_class() | MAPI message class string लौटाएँ |
mapi_message::recipients() | प्राप्तकर्ता सूची लौटाएँ |
mapi_message::attachments() | संलग्नक सूची लौटाएँ |
mapi_attachment::is_embedded_message() | True यदि संलग्नक एक एम्बेडेड MSG है |
mapi_message::unicode_strings() | True यदि संदेश Unicode स्ट्रिंग गुणों का उपयोग करता है |