می‌توانید یک فایل را مستقیماً از دیسک یا از یک جریان باز به پیام Outlook MSG پیوست کنید. دیگر نیازی نیست ابتدا کل فایل را در حافظه بخوانید. این راهنما هر دو گزینه را نشان می‌دهد، توضیح می‌دهد که مسئول بستن جریان چه کسی است و نشان می‌دهد چگونه پیوست‌ها را به همان روش بخوانید.

چرا پیوست‌های بزرگ را با پشتیبانی از جریان اضافه کنیم

وقتی فایلی را به‌صورت آرایه بایت پیوست می‌کنید، کل فایل ابتدا باید در حافظه باشد. این برای فایل‌های بزرگ مقدار زیادی حافظه مصرف می‌کند و یک آرایه بایت .NET نمی‌تواند بیش از حدود ۲٫۱ گیگابایت را نگه دارد، بنابراین فایل‌های بزرگ‌تر به این روش نمی‌توانند پیوست شوند.

وقتی به‌جای آن از مسیر فایل یا یک جریان برای پیوست استفاده می‌کنید، Aspose.Email for .NET محتوا را فقط زمانی می‌خواند که به آن نیاز دارد: هنگام ذخیره پیام یا باز کردن پیوست. استفاده از حافظه کم می‌ماند و اندازه فایل دیگر توسط آنچه در یک آرایه بایت جا می‌گیرد محدود نمی‌شود.

شما می‌توانید با پیوست‌ها به چهار روش کار کنید:

  • فایل را با مسیر آن پیوست کنید، در صورت نیاز با نام نمایشی متفاوت.
  • محتوا را از یک جریان که قبلاً باز کرده‌اید پیوست کنید.
  • اندازهٔ پیوست را بدون خواندن آن بررسی کنید.
  • یک پیوست موجود را به عنوان جریان فقط‑خواندنی باز کنید.

استفاده از Aspose.Email برای افزودن پیوست‌های بزرگ

Aspose.Email for .NET 26.9 or later را از NuGet نصب کنید:

Install-Package Aspose.Email

مثال‌ها از فضای نام Aspose.Email.Mapi و System.IO استفاده می‌کنند.

پیوست یک فایل بزرگ از مسیر آن

اگر فایل قبلاً روی دیسک موجود باشد، مسیر آن را بدهید. پیام هنگام نیاز به محتوا، فایل را باز می‌کند، بنابراین فایل هرگز به‌صورت کامل در حافظه بارگذاری نمی‌شود.

using (var msg = new MapiMessage("from@domain.com", "to@domain.com", "Quarterly report", "See the archive attached."))
{
    msg.Attachments.AddFile(@"C:\data\archive.zip");
    msg.Save(@"C:\out\report.msg");
}

پس از اجرای کد، report.msg حاوی آرشیو ZIP به عنوان پیوست با نام archive.zip است. برای نمایش نام متفاوت در کلاینت ایمیل، آن را به عنوان آرگومان دوم پاس دهید.

بخش using را نگه دارید. وقتی با مسیر پیوست می‌کنید، پیام فایل را تا زمان آزادسازی باز نگه می‌دارد. اگر این مرحله را نادیده بگیرید، فایل قفل می‌ماند.

پیوست یک فایل بزرگ از یک جریان

اگر قبلاً محتوا را به‌صورت یک جریان دارید، برای مثال فایلی که برای هدف دیگری باز کرده‌اید، جریان را مستقیماً پیوست کنید و به پیوست یک نام بدهید.

using (var content = File.OpenRead(@"C:\data\presentation.pptx"))
{
    var msg = new MapiMessage("from@domain.com", "to@domain.com", "Slides", "Slides attached.");
    var attachment = msg.Attachments.Add("presentation.pptx", content);
    Console.WriteLine($"Attachment size: {attachment.ContentLength} bytes");
    msg.Save(@"C:\out\slides.msg");
}

کنسول اندازهٔ ارائه را نشان می‌دهد و slides.msg شامل فایل کامل است. از آنجا که پیوست جدید به شما برگردانده می‌شود، می‌توانید بلافاصله اندازهٔ آن را بدون خواندن محتوا بررسی کنید.

آنچه جریان نیاز دارد

جریان باید سه شرط را برآورده کند:

  • باید از خواندن و جستجو پشتیبانی کند. Aspose.Email طول را بررسی می‌کند و ممکن است هنگام ذخیره‌سازی محتوا را بیش از یک بار بخواند. اگر جریان شرایط لازم را نداشته باشد، بلافاصله پس از پیوست کردن آن خطایی دریافت می‌کنید، نه بعداً هنگام ذخیره.
  • محتوا از موقعیت فعلی تا انتها گرفته می‌شود. اگر قبلاً بخشی از جریان را خوانده‌اید، قبل از پیوست کردن آن به ابتدا بازگردید.
  • باید تا زمان ذخیره باز بماند. محتوا به‌صورت درخواست‌محور خوانده می‌شود، بنابراین بستن زودهنگام جریان ذخیره را خراب می‌کند.

اگر منبع شما قابلیت جستجو ندارد، مانند دانلود از وب، ابتدا آن را به یک جریان قابل جستجو کپی کنید:

using (var buffer = new MemoryStream())
{
    responseStream.CopyTo(buffer);
    buffer.Position = 0;
    msg.Attachments.Add("download.bin", buffer);
}

در نظر داشته باشید که یک جریان حافظه تمام فایل را در حافظه نگه می‌دارد. برای دانلودهای بسیار بزرگ، محتوا را در یک فایل موقت ذخیره کنید و به جای آن فایل را پیوست کنید.

چه کسی جریان را می‌بندد

به‌طور پیش‌فرض، جریان متعلق به شما می‌ماند. پس از ذخیره شدن پیام، همان‌طور که بلوک using در مثال بالا انجام می‌دهد، آن را می‌بندید.

اگر ترجیح می‌دهید جریان را به پیام بدهید، به عنوان آرگومان سوم مقدار false را پاس کنید. سپس پیام هنگام آزاد شدن خود پیام، جریان را می‌بندد، بنابراین مطمئن شوید پیام را آزاد کنید. همین امر هنگام پیوست کردن یک فایل با مسیر آن نیز صادق است.

پیوست‌ها را به‌عنوان جریان‌ها بخوانید

شما همچنین می‌توانید مسیر دیگر را پیش بگیرید: یک پیوست را در یک پیام موجود به‌صورت جریان فقط‑خواندنی باز کنید و آن را به دیسک کپی کنید، بدون اینکه نسخه‌ای در حافظه ایجاد کنید.

var msg = MapiMessage.Load(@"C:\data\message.msg");
foreach (MapiAttachment attachment in msg.Attachments)
{
    Console.WriteLine($"{attachment.LongFileName}: {attachment.ContentLength} bytes");
    using (Stream source = attachment.OpenRead())
    using (Stream target = File.Create(Path.Combine(@"C:\out", attachment.LongFileName)))
    {
        source.CopyTo(target);
    }
}

کنسول هر پیوست را به همراه اندازه‌اش فهرست می‌کند و هر فایل در C:\out ذخیره می‌شود. هر استریمی که باز می‌کنید مستقل است، بنابراین خواندن یک پیوست بر دیگری تأثیر نمی‌گذارد.

مراحل بعدی

برای جزئیات کامل پارامترها، به روش‌های پیوست در مرجع API مراجعه کنید و برای سایر وظایف پیوست، به مستندات Aspose.Email for .NET نگاه کنید. اگر با مشکلی مواجه شدید، در انجمن پشتیبانی Aspose.Email سؤال کنید.

سوالات متداول

  1. چرا به جای آرایه بایت، از یک جریان یا مسیر فایل پیوست کنید؟ یک آرایه بایت تمام فایل را قبل از پیوست کردن در حافظه نگه می‌دارد و نمی‌تواند بیش از حدود ۲٫۱ گیگابایت را نگه دارد. پیوست کردن از یک جریان یا مسیر فایل به Aspose.Email اجازه می‌دهد محتوا را فقط زمانی که به آن نیاز دارد بخواند، مانند زمانی که پیام را ذخیره می‌کنید.

  2. آیا Aspose.Email جریان را که پاس می‌دهم می‌بندد؟ به‌طور پیش‌فرض نه. شما مالکیت را حفظ می‌کنید و باید جریان را تا زمان ذخیره شدن پیام باز بگذارید. اگر می‌خواهید پیام آن را برای شما ببندد، مقدار false را برای آرگومان leaveStreamOpen پاس کنید و پس از اتمام کار، پیام را حذف کنید.

  3. آیا می‌توانم یک جریان که از جستجو پشتیبانی نمی‌کند، مانند یک جریان شبکه، را پیوست کنم؟ خیر. جریان باید هم خواندن و هم جستجو را پشتیبانی کند. ابتدا محتوا را به یک جریان قابل جستجو کپی کنید.

  4. آیا می‌توانم اندازه یک پیوست را بدون خواندن آن پیدا کنم؟ بله. هر پیوست اندازه خود را بر حسب بایت از طریق ویژگی ContentLength گزارش می‌دهد، بدون اینکه محتوا را بخواند.

  5. چگونه می‌توانم یک پیوست را بدون بارگذاری در حافظه به دیسک ذخیره کنم؟ پیوست را به‌عنوان یک جریان فقط‑خواندنی با OpenRead باز کنید و آن جریان را به یک فایل کپی کنید.

دریافت یک لایسنس رایگان و کشف بیشتر

درخواست یک مجوز موقت رایگان برای تست Aspose.Email for .NET بدون محدودیت‌های ارزیابی.