Πώς να εργαστείτε με τα συνημμένα στο C++
Aspose.Email FOSS for C++ provides the mapi_attachment Η τάξη για τη δημιουργία προσθήκης από ξηρά μύθια ή ρεύματα, και το mapi_message Ετικέτες Διαβάστε ΕΠΙΣΤΗΜΗ από υπάρχοντα αρχεία MSG. Μπορείτε να προσθέσετε συνημμένα κατά τη σύνθεση μηνυμάτων και να τα ελέγξετε όταν φορτώνετε αρχεία, συμπεριλαμβανομένης της ανίχνευσης εάν ένα συνημμένο είναι ενσωματωμένο Μηνύματα MSG.
Βήμα 1 - Εισάγετε το έργο
git clone https://github.com/aspose-email-foss/Aspose.Email-FOSS-for-Cpp.gitadd_subdirectory(Aspose.Email-FOSS-for-Cpp)
target_link_libraries(your_target PRIVATE AsposeEmailFoss::AsposeEmailFoss)Βήμα 2 - Προσθήκη ενός αρχείου από τα Bytes
Χρησιμοποιήστε mapi_message::add_attachment() να προσθέσετε δυαδικά δεδομένα κατά τη σύνθεση ενός μηνύματος. Πάρτε το όνομα του, τα ρυπαρά bytes ως ένα std::vector<std::uint8_t>,Και το MIME Τύπος περιεχομένου:
#include <filesystem>
#include <vector>
#include "aspose/email/foss/msg/mapi_message.hpp"
int main()
{
auto message = aspose::email::foss::msg::mapi_message::create(
"Report", "Please review the attached report.");
message.set_sender_name("Alice");
message.set_sender_email_address("alice@example.com");
message.add_recipient("bob@example.com", "Bob");
// Attach a text file
std::vector<std::uint8_t> text_data{'H', 'e', 'l', 'l', 'o'};
message.add_attachment("notes.txt", text_data, "text/plain");
// Attach a binary blob
std::vector<std::uint8_t> bin_data{0x00, 0x01, 0x02, 0x03};
message.add_attachment("data.bin", bin_data, "application/octet-stream");
message.save(std::filesystem::path("report.msg"));
}Βήμα 3 - Προσθήκη ενός συνδετήματος από ένα αρχείο στον δίσκο
Διαβάστε το αρχείο σε ένα byte vector και μετά μεταφέρετε το στο add_attachment():
#include <filesystem>
#include <fstream>
#include <iterator>
#include <vector>
#include "aspose/email/foss/msg/mapi_message.hpp"
int main()
{
// Read a file into bytes
std::ifstream file("document.pdf", std::ios::binary);
std::vector<std::uint8_t> pdf_bytes(
std::istreambuf_iterator<char>(file),
std::istreambuf_iterator<char>{});
auto message = aspose::email::foss::msg::mapi_message::create(
"Document", "See attached PDF.");
message.set_sender_name("Alice");
message.set_sender_email_address("alice@example.com");
message.add_recipient("bob@example.com", "Bob");
message.add_attachment("document.pdf", pdf_bytes, "application/pdf");
message.save(std::filesystem::path("with_pdf.msg"));
}Βήμα 4 – Διαβάστε τα πρόσθετα από ένα υπάρχον αρχείο MSG
message.attachments() Επιστρέφει ο Α const αναφορά σε ένα vector των αντικειμένων προσκόλληση. Κάθε έκθεση filename, mime_type, data (από τις ρυτίδες) και content_id:
#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 << "Attachments: " << message.attachments().size() << '\n';
for (std::size_t i = 0; i < message.attachments().size(); ++i)
{
const auto& a = message.attachments()[i];
std::cout << "[" << (i + 1) << "]"
<< " name=" << a.filename
<< " mime=" << a.mime_type
<< " bytes=" << a.data.size()
<< " content_id=" << a.content_id
<< '\n';
}
}Βήμα 5 – Ανακαλύψτε και να έχετε πρόσβαση σε ενσωματωμένα μηνύματα
Ορισμένα αρχεία MSG περιέχουν άλλα αρχείο MSM ως προσθήκες (προσδιορίστηκαν ή συναντήθηκαν πρόσκληση). Χρησιμοποιήστε is_embedded_message() να εντοπίσουν αυτά και να αποκτήσουν πρόσβαση στο αναρτημένο μήνυμα μέσω embedded_message:
#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);
for (const auto& attachment : message.attachments())
{
if (attachment.is_embedded_message() && attachment.embedded_message != nullptr)
{
const auto& inner = *attachment.embedded_message;
std::cout << "Embedded subject: " << inner.subject() << '\n';
std::cout << "Embedded from: " << inner.sender_email_address() << '\n';
// Save the embedded message as a standalone MSG
inner.save(std::filesystem::path("embedded.msg"));
}
else
{
std::cout << "Regular attachment: " << attachment.filename
<< " (" << attachment.data.size() << " bytes)\n";
}
}
}Βήμα 6 – Αποθηκεύστε τα δεδομένα σύνδεσης στον δίσκο
Εξάγετε τα byte προσθήκης και γράψτε αυτά σε ένα αρχείο χρησιμοποιώντας τυποποιημένες ροές αρχείων C++:
#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"));
const std::filesystem::path out_dir("attachments");
std::filesystem::create_directories(out_dir);
for (const auto& a : message.attachments())
{
if (!a.is_embedded_message())
{
const auto out_path = out_dir / a.filename;
std::ofstream out(out_path, std::ios::binary);
out.write(reinterpret_cast<const char*>(a.data.data()),
static_cast<std::streamsize>(a.data.size()));
std::cout << "Saved: " << out_path << '\n';
}
}
}Κοινά προβλήματα και τακτοποιήσεις
attachment.data Είναι άδειο για ένα γνωστό μεγάλο προσάρτημα. Ελέγξτε το αρχείο MSG πραγματικά περιέχει τα δεδομένα προσθήκης (όχι μια σύνδεση OLE). αρχεία MSG εξάγονται από μερικά Οι πελάτες ταχυδρομείου μπορούν να αποθηκεύουν συνημμένα ως εξωτερικές αναφορές που η βιβλιοθήκη δεν μπορεί να ακολουθήσει.
is_embedded_message() Επιστροφή true Αλλά embedded_message Είναι nullptr. Η το κεφάλαιο προσθήκης υποδεικνύει ένα ενσωματωμένο MSG, αλλά τα δεδομένα δεν ήταν διαχωριστικά. Η πηγή MSG είναι έγκυρη και δεν έχει κλωστογραφηθεί.
Η αποθήκευση του εξαγοράσματος δεν επιτυγχάνεται με σφάλμα διαδρομής. Μερικά φιλανθρωπικά ονόματα περιέχουν χαρακτήρες που είναι αναποτελεσματικοί στο σύστημα αρχείων στόχου (π.χ., :, ? Ο ΣΕ Windows - Υγεία attachment.filename πριν από την κατασκευή του δρόμου εξόδου.
Τα μεγάλα αρχεία MSG προκαλούν υψηλή χρήση μνήμης. ΟΙ ΠΡΟΣΟΧΕΣmapi_message::from_file() Κατεβάζει όλα για μεγάλα αρχεία, ανοίξτε το υποκείμενο εμπορευματικό δοχείο με cfb_reader να έχουν πρόσβαση σε μεμονωμένες ροές χωρίς πλήρη υλιστοποίηση όλων των προσθέσεων.
add_attachment() Δεν βρέθηκε κατά τη διάρκεια της συλλογής. Βεβαιωθείτε ότι χρησιμοποιείτε το σωστό Περιλαμβάνει: "aspose/email/foss/msg/mapi_message.hpp".Η μέθοδος είναι ένα μέλος της aspose::email::foss::msg::mapi_message.
Συχνές ερωτήσεις
Ποια είδη MIME πρέπει να χρησιμοποιήσω για τις προσθήκες;?
Χρησιμοποιήστε τον τυποποιημένο τύπο IANA MIME για τη μορφή αρχείου: "text/plain" Για .txt, "application/pdf" Για .pdf, "application/octet-stream" ως γενική αποτυχία για την διδάσκονται τα αρχεία. ο τύπος MIME αποθηκεύεται ως το attach_mime_tag Χάρτης ιδιοκτησίας.
Μπορώ να προσθέσω το ίδιο αρχείο πολλές φορές;?
Κάθε κλήση για add_attachment() Εισάγετε μια ανεξάρτητη εισαγωγή προσθήκης.Duplicate επιτρέπονται τα ονόματα των φυλών· διακρίνονται με θέση στη λίστα προσθήκης.
Πώς μπορώ να ρυθμίσω το Content-ID για τις ενσωματωμένες εικόνες;?
Πάρτε το περιεχόμενο ID string ως τέταρτο επιχείρημα για να mapi_attachment::from_stream():
auto att = aspose::email::foss::msg::mapi_attachment::from_bytes(
"logo.png", png_bytes, "image/png", "<logo-cid@example.com>");content_id εκθέτει ως attachment.content_id Όταν διαβάζεις πίσω.
Είναι attachment.data ΕΝΑ ΚΟΙΝΗΜΑ Ή ΑΡΘΡΟ;?
attachment.data Είναι η std::vector<std::uint8_t> Η αξία που αποθηκεύεται μέσα στο mapi_message Η πρόσβαση σε αυτό δεν προκαλεί επιπλέον I/O.
Μπορώ να αφαιρέσω ένα προσάρτημα πριν από την εξοικονόμηση;?
Η mapi_message Το API δεν εκθέτει μια μέθοδο άμεσης αφαιρέσεως-αποσύνδεσης σε έκδοση 0.1.0. Build a new message, copy the desired properties and attachments manually, και να σώσει το νέο αντικείμενο.