C++'da Ekler ile Nasıl Çalışılır

C++'da Ekler ile Nasıl Çalışılır

Aspose.Email FOSS for C++ provides the mapi_attachment Ayarlar oluşturmak için sınıf Çevre ve Yaşam Destek Programları ve mapi_message Okuma Yazılımı için Ayarlar Mevcut MSG dosyaları. mesajlar oluştururken ekler ve bunları inceleyebilirsiniz dosyaları yüklediğinizde, eğer bir ek kendisi yerleşik bir dosya olup olmadığını tespit etmek de dahil olmak üzere; Mesajı da gönderin.

1. Adım - 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 - Byte’den dosya eklerini ekleyin

kullanmak mapi_message::add_attachment() Mesaj yazarken ikili verileri ekleyebilirsiniz. A) Baskı, baskın gibi bir şey yapar. std::vector<std::uint8_t>,Ve o da bir yerlerde İçerik Tipi :

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

Adım 3 - Diskteki bir dosyadan ek ekleme

Dosyayı bir bayt vektoruna okuyun, sonra onu iletin 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"));
}

Adım 4 - Mevcut bir MSG dosyasından Ekler Okumak

message.attachments() Geri Dönüş A const Vektorlar, bir nesneye bağlanma yöntemi olarak tanımlanır. Her bir sergiye filename, mime_type, data (Kırmızı bir çubuk) ve 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';
    }
}

Adım 5 - Girişli Mesajları Keşfedin ve Eriştirebilirsiniz

Bazı MSG dosyaları diğer MSG Dosyalarını ek olarak (özerk veya toplantı davetleri) içerir. kullanmak is_embedded_message() Bu mesajı bulup, bu mesajın içeriğine ulaşmak için 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";
        }
    }
}

Adım 6 - Disk Dosyası Kaydetme

Ek birim baytlarını çıkarın ve standart C++ dosya akışları kullanarak bir dosyaya yazın:

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

Yaygın Sorunlar ve Çözümler

attachment.data Bilinen bir boşlukta, geniş bir bağlanma vardır. Kaynak dosyası kontrol etme aslında ek verileri içerir (OLE bağlantısı değil). MSG bazı dosyaları dışarı Posta istemcileri, kitaplıkta takip edilemeyecek harici referanslar olarak ekleri depolayabilir.

is_embedded_message() Geri Dönüş true Ama embedded_message ı nullptr. OYUN Bu sayede, bir bilgisayarın içine giren bir dosya (URL) yerleştirilebilir ancak veriler okunamaz. Kaynak MSG geçerli ve kesilmemiş.

Kaydetilen ek bir yol hatası ile başarısız olur. Bazı dosya bağlantıları Hedef dosya sisteminde geçerli olmayan karakterler içerir (örneğin,., :, ? ı İyileşme - Sanitize attachment.filename çıkış yolu oluşturmadan önce.

Büyük MSG dosyaları yüksek bellek kullanımına neden olur. İÇİNmapi_message::from_file() Tüm yükler Büyük dosyaları için, altındaki CFB konteynerini açın. cfb_reader Tüm eklentileri tamamen gerçekleştiremeden bireysel akışlara erişmek.

add_attachment() Toplam zamanında bulunamadı. Doğru kullanıyorsanız emin olun İçerir : "aspose/email/foss/msg/mapi_message.hpp".Bu yöntem bir üyedir aspose::email::foss::msg::mapi_message.

Sık Sorulan Sorular

Hangi MIME türleri eklerim için kullanmalıyım?

Dosya biçimi için standart IANA MIME türünü kullanın: "text/plain" için .txt, "application/pdf" için .pdf, "application/octet-stream" Bir de genetik bir geri dönüşüm olarak Binary File: MIME türü, bir dosya olarak depolanır. attach_mime_tag Malı mülk sahibi.

Aynı dosyayı birden fazla kez ekleyebilir miyim?

Evet, her çağrı için add_attachment() Bağımsız bir giriş yapar.Duplikate İsteğe bağlı olarak, bu isimler listede yer alan dosyaların arasında ayrılır.

İçerik-ID’yi içerideki resimler için nasıl ayarlayabilirim?

İçerik ID dizisini dördüncü argüman olarak aktarın 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 olarak sergilendiği gibi attachment.content_id Geri okurken.

Bu attachment.data Bir kopya mı, referans mı?

attachment.data A a a std::vector<std::uint8_t> İçinde değer kaydedilen mapi_message Objektif: Bu objektife erişmek ek I/O’ya neden olmaz.

Bir kaydetmeden önce bir ekleyiciyi çıkarabilir miyim?

OYUN mapi_message API, sürümde doğrudan bir kaldırma-açıklama yöntemi ortaya çıkarmaz. 0.1.0. Build a new message, copy the desired properties and attachments manually, Yeni nesneyi kurtarın.

Bu da

 Türkçe