Wie man mit Anhängen in C++ arbeitet

Wie man mit Anhängen in C++ arbeitet

Aspose.Email FOSS for C++ provides the mapi_attachment Klasse zum Erstellen von Anhängen aus Rohbytes oder Strömen und der mapi_message Anlage für das Lesen von Anhängen aus vorhandenen MSG-Dateien. Sie können Anhänge beim Schreiben von Nachrichten hinzufügen und sie überprüfen beim Laden von Dateien, einschließlich der Erkennung, ob ein Anhang selbst ein eingebetteter Die Nachricht ist.

Schritt 1 – Set up the Project

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)

Schritt 2 — Hinzufügen eines Dateianhangs aus Byte

benutzen mapi_message::add_attachment() Binäre Daten beim Schreiben einer Nachricht. Geben Sie den Dateinamen an, die Rohbytes als a std::vector<std::uint8_t>,und der Platzhalter Inhaltstyp :

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

Schritt 3 - Hinzufügen eines Anhangs aus einer Datei auf der Festplatte

Lesen Sie die Datei in einen Byte-Vektor und geben Sie sie dann an 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"));
}

Schritt 4 - Lesen von Anhängen aus einer vorhandenen MSG Datei

message.attachments() Rückkehr a const Bezugnahme auf einen Vektor von Anbindungsobjekten. Jede Ausstellung filename, mime_type, data (die Rohbüte) und 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';
    }
}

Schritt 5 – Erkennen und Zugriff auf eingebettete Nachrichten

Einige MSG Dateien enthalten andere MSG-Dateien als Anhänge (Vorleitung oder Treffen einladungen). benutzen is_embedded_message() um diese zu erkennen und auf die eingebettete Nachricht zugreifen, indem Sie 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";
        }
    }
}

Schritt 6 – Speichern von Anhängerdaten auf der Festplatte

Extrakte Anlage-Bytes und schreiben Sie sie in eine Datei mit Standard C++-Dateiströmen:

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

Häufige Probleme und Lösungen

attachment.data Es ist leer für eine bekannte große Bindung. Überprüfen der Quelle MSG Datei enthält die Anhangdaten (nicht einen OLE-Link). MSG Dateien, die aus einigen E-Mail-Clients können Anhänge als externe Referenzen speichern, die die Bibliothek nicht verfolgen kann.

is_embedded_message() Rückkehr true aber embedded_message ist nullptr. Die Anhangheader zeigt einen eingebetteten MSG an, aber die Daten waren nicht lesbar. Die Quelle MSG ist gültig und nicht abgeschnitten.

Das Speichern von extrahiertem Anhang fehlschlägt bei einem Pfadfehler. Einige Datei-Anhänge enthalten, die auf dem Zieldateisystem ungültig sind (z. B.., :, ? ist Windows – Sanitise attachment.filename bevor der Ausgangspfad erstellt wird.

Große MSG Dateien verursachen einen hohen Speicherverbrauch. - diemapi_message::from_file() Laden Sie alle Anlagedaten in den Speicher. Für große Dateien öffnen Sie den zugrunde liegenden CFB-Container mit cfb_reader Zugriff auf einzelne Streams ohne vollständige Materialisierung aller Anhänge.

add_attachment() nicht in der Zeit des Zusammenstellens gefunden. Stellen Sie sicher, dass Sie die richtige Dazu gehören: "aspose/email/foss/msg/mapi_message.hpp".Die Methode ist ein Mitglied der aspose::email::foss::msg::mapi_message.

Häufig gestellte Fragen

Welche MIME Typen sollte ich für Anhänge verwenden?

Verwenden Sie für das Dateiformat die Standard-Typ IANA MIME: "text/plain" für .txt, "application/pdf" für .pdf, "application/octet-stream" Als generisches Fallback für binäre Dateien. Der MIME Typ wird als attach_mime_tag Eigentum der Immobilie.

Kann ich die gleiche Datei mehrmals hinzufügen?

Ja, jeder Aufruf an add_attachment() Es wird ein unabhängiger Anhang eingefügt. Duplikat Dateinamen sind erlaubt; sie werden durch Position in der Anhangliste unterschieden.

Wie kann ich die Content-ID für Inline-Bilder einrichten?

Geben Sie die Content ID-String als viertes Argument an 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 Es wird als attachment.content_id Wenn ich zurück lese.

ist attachment.data Eine Kopie oder eine Referenz?

attachment.data ist a std::vector<std::uint8_t> Der Wert wird im Inneren der mapi_message Objekt. Der Zugriff auf ihn löst keine zusätzlichen I/O aus.

Kann ich einen Anhang entfernen, bevor ich speichere?

Die mapi_message API zeigt keine direkte Entfernen-Anhängemethode in der Version auf 0.1.0. Build a new message, copy the desired properties and attachments manually, und das neue Objekt zu speichern.

Siehe auch

 Deutsch