محول تنسيق البريد الإلكتروني لـ .NET

يوفر Aspose.Email LowCode Converter API بسيط ومستوى عال لتحويل رسائل البريد الإلكتروني بين تنسيقات مختلفة مع الحد الأدنى من تعقيدات الرمز.هذا دليل المطور يغطي الوظائف الأساسية ونماذج التنفيذ وأفضل الممارسات لاستخدام المحول في تطبيقات .NET.

البريد الإلكتروني.LowCode

و هو Aspose.Email.LowCode اسمespace يحتوي على فصول مصممة لتسريع عمليات تحويل تنسيق البريد الإلكتروني.المكون الرئيسي هو Converter فئة، التي تقدم أساليب ثابتة لتحويل رسائل البريد الإلكتروني بين تنسيقات شعبية بما في ذلك EML، MSG، HTML، MHT، و MHTML.

المكونات الرئيسية

  • Converter : أساليب التحويل الثابتة لتحويل تنسيق البريد الإلكتروني
  • IoutputHandler : واجهة للتعامل مع تدفقات الناتج المحمولة
  • FolderOutputHandler : التنفيذ المدمج لتخزين الناتج القائم على المجلد

بدء الاستخدام

التثبيت

قم بتثبيت حزمة Aspose.Email من خلال NuGet Package Manager:

Install-Package Aspose.Email

إعلان الاسم

using Aspose.Email.LowCode;
using System.IO;
using System.Threading.Tasks;

طرق التحويل الأساسية

تحويل النموذج الجيني

و هو Convert يوفر الطريقة تحويل تنسيق مرن مع مواصفات نوع الإنتاج الواضحة:

public static Task Convert(Stream input, string nameWithExtension, IOutputHandler handler, string outputType)

نموذج التنفيذ:

using var inputStream = File.OpenRead("email.eml");
var outputHandler = new FolderOutputHandler(@"C:\ConvertedEmails");

await Converter.Convert(inputStream, "email.eml", outputHandler, "html");

طرق التحويل المتخصصة

يوفر المحول أساليب مخصصة لسيناريوهات التحويل الشائعة:

تحويل إلى HTML Format

await Converter.ConvertToHtml(inputStream, "email.eml", outputHandler);

تحويل إلى MSG Format

await Converter.ConvertToMsg(inputStream, "email.eml", outputHandler);

تحويل إلى EML Format

await Converter.ConvertToEml(inputStream, "email.msg", outputHandler);

تحويل إلى تنسيقات MHTML/MHT

await Converter.ConvertToMhtml(inputStream, "email.eml", outputHandler);
await Converter.ConvertToMht(inputStream, "email.eml", outputHandler);

EML / MSG تحويل محدد

للكشف التلقائي عن الشكل بين EML و MSG تنسيقات:

await Converter.ConvertEmlOrMsg(inputStream, "email.eml", outputHandler, "html");

تطوير خادم الناتج

باستخدام FolderOutputHandler

البناء في FolderOutputHandler يتم حفظ الفئة تلقائيًا من الملفات التي تم تحويلها إلى دليل محدد:

public class FolderOutputHandler : IOutputHandler
{
    public FolderOutputHandler(string path)
    public string Path { get; set; }
}

نموذج الاستخدام:

var outputHandler = new FolderOutputHandler(@"C:\OutputDirectory");

مبدع الخروج المخصص

تنفيذه من IOutputHandler واجهة لمعالجة الناتج المخصصة:

public class CustomOutputHandler : IOutputHandler
{
    public async Task AddOutputStream(string name, Func<Stream, Task> writeAction)
    {
        // Custom async implementation
        using var customStream = CreateCustomStream(name);
        await writeAction(customStream);
    }
    
    public void AddOutputStream(string name, Action<Stream> writeAction)
    {
        // Custom synchronous implementation
        using var customStream = CreateCustomStream(name);
        writeAction(customStream);
    }
}

تداول الخيارات الثنائية Format Matrix

إدخال formatتنسيقات الخروجالطريقة
EMLHTML، MSG، MHTML، MHTConvertToHtml(), ConvertToMsg(), وما إلى ذلك.
MSGHTML، EML، MHTML، MHTConvertToHtml(), ConvertToEml(), وما إلى ذلك.
أي شكل البريد الإلكترونيالمستخدم المحددConvert() مع نموذج الإنتاج مع المعلمات

نموذج التنفيذ المتقدم

تطوير Batch Processing

public class EmailBatchConverter
{
    private readonly IOutputHandler _outputHandler;
    
    public EmailBatchConverter(IOutputHandler outputHandler)
    {
        _outputHandler = outputHandler;
    }
    
    public async Task ConvertBatch(IEnumerable<string> emailFiles, string outputFormat)
    {
        var conversionTasks = emailFiles.Select(async file =>
        {
            using var stream = File.OpenRead(file);
            var fileName = Path.GetFileName(file);
            
            await Converter.Convert(stream, fileName, _outputHandler, outputFormat);
        });
        
        await Task.WhenAll(conversionTasks);
    }
}

خطأ التعامل مع نموذج

public async Task<ConversionResult> SafeConvert(string inputFile, string outputFormat)
{
    try
    {
        using var inputStream = File.OpenRead(inputFile);
        var outputHandler = new FolderOutputHandler(@"C:\Output");
        var fileName = Path.GetFileName(inputFile);
        
        await Converter.Convert(inputStream, fileName, outputHandler, outputFormat);
        
        return new ConversionResult { Success = true };
    }
    catch (Exception ex)
    {
        return new ConversionResult 
        { 
            Success = false, 
            ErrorMessage = ex.Message 
        };
    }
}

معالجة الذاكرة المحسنة

public async Task ConvertWithMemoryOptimization(string inputFile)
{
    using var inputStream = new FileStream(inputFile, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, useAsync: true);
    var outputHandler = new FolderOutputHandler(@"C:\Output");
    
    await Converter.ConvertToHtml(inputStream, Path.GetFileName(inputFile), outputHandler);
}

التكوين والتكيف

هيكل الدليل الناتج

عند استخدام FolderOutputHandler, يحافظ المحول على بنية الملف الأصلية:

var outputHandler = new FolderOutputHandler(@"C:\ConvertedEmails");
// Original: sample.eml → Output: C:\ConvertedEmails\sample.html

استراتيجية الاسم المخصص

تنفيذ اسم الملفات المخصصة من خلال خادم الإنتاج المتخصص:

public class TimestampOutputHandler : IOutputHandler
{
    private readonly string _basePath;
    
    public TimestampOutputHandler(string basePath)
    {
        _basePath = basePath;
    }
    
    public async Task AddOutputStream(string name, Func<Stream, Task> writeAction)
    {
        var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
        var newName = $"{timestamp}_{name}";
        var filePath = Path.Combine(_basePath, newName);
        
        using var fileStream = File.Create(filePath);
        await writeAction(fileStream);
    }
    
    // Synchronous implementation omitted for brevity
}

اعتبارات الأداء

العمليات غير المتزامنة

جميع أساليب التحويل العودة Task الكائنات التي تسمح بمعالجة غير متزامنة فعالة:

public async Task ProcessMultipleEmailsAsync()
{
    var tasks = new[]
    {
        ConvertEmailAsync("email1.eml"),
        ConvertEmailAsync("email2.msg"),
        ConvertEmailAsync("email3.eml")
    };
    
    await Task.WhenAll(tasks);
}

إدارة الموارد

إن التوزيع الصحيح أمر بالغ الأهمية من أجل الأداء الأمثل:

// Correct pattern
using (var inputStream = File.OpenRead("email.eml"))
{
    await Converter.ConvertToHtml(inputStream, "email.eml", outputHandler);
}

// Alternative using statement
using var inputStream = File.OpenRead("email.eml");
await Converter.ConvertToHtml(inputStream, "email.eml", outputHandler);

تحسين استخدام الذاكرة

بالنسبة لملفات البريد الإلكتروني الكبيرة ، فكر في نهج البث:

public async Task ConvertLargeEmail(string inputPath)
{
    const int bufferSize = 65536; // 64KB buffer
    
    using var inputStream = new FileStream(inputPath, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, true);
    var outputHandler = new FolderOutputHandler(@"C:\Output");
    
    await Converter.ConvertToHtml(inputStream, Path.GetFileName(inputPath), outputHandler);
}

نموذج التكامل

ASP.NET Core Web API التكامل

[ApiController]
[Route("api/[controller]")]
public class EmailConverterController : ControllerBase
{
    [HttpPost("convert")]
    public async Task<IActionResult> ConvertEmail(IFormFile emailFile, [FromQuery] string format = "html")
    {
        if (emailFile == null || emailFile.Length == 0)
            return BadRequest("No file provided");
        
        try
        {
            using var inputStream = emailFile.OpenReadStream();
            var outputHandler = new MemoryOutputHandler();
            
            await Converter.Convert(inputStream, emailFile.FileName, outputHandler, format);
            
            return File(outputHandler.GetContent(), GetContentType(format), $"converted.{format}");
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Conversion failed: {ex.Message}");
        }
    }
    
    private string GetContentType(string format) => format.ToLower() switch
    {
        "html" => "text/html",
        "mhtml" => "message/rfc822",
        "eml" => "message/rfc822",
        _ => "application/octet-stream"
    };
}

تنفيذ Windows Service

public class EmailConverterService : BackgroundService
{
    private readonly string _watchFolder;
    private readonly string _outputFolder;
    
    public EmailConverterService(IConfiguration config)
    {
        _watchFolder = config["EmailConverter:WatchFolder"];
        _outputFolder = config["EmailConverter:OutputFolder"];
    }
    
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        var watcher = new FileSystemWatcher(_watchFolder, "*.eml");
        watcher.Created += async (sender, e) => await ProcessEmailFile(e.FullPath);
        watcher.EnableRaisingEvents = true;
        
        while (!stoppingToken.IsCancellationRequested)
        {
            await Task.Delay(1000, stoppingToken);
        }
    }
    
    private async Task ProcessEmailFile(string filePath)
    {
        using var inputStream = File.OpenRead(filePath);
        var outputHandler = new FolderOutputHandler(_outputFolder);
        
        await Converter.ConvertToHtml(inputStream, Path.GetFileName(filePath), outputHandler);
    }
}

Troubleshooting

المشاكل الشائعة والحلول

مسألةالحل
FileNotFoundExceptionتحقق من مسار ملف الإدخال والترخيص
UnauthorizedAccessExceptionالتحقق من دليل الإخراج كتابة التراخيص
OutOfMemoryExceptionاستخدم النهج المتحرك للملفات الكبيرة
InvalidOperationExceptionضمان تنسيق البريد الإلكتروني الصحيح لملف الإدخال

نصائح Debugging

يتيح التسجيل التفصيلي لحل المشاكل:

public async Task ConvertWithLogging(string inputFile)
{
    var logger = LoggerFactory.Create(builder => builder.AddConsole()).CreateLogger<EmailConverter>();
    
    try
    {
        logger.LogInformation($"Starting conversion of {inputFile}");
        
        using var inputStream = File.OpenRead(inputFile);
        var outputHandler = new FolderOutputHandler(@"C:\Output");
        
        await Converter.ConvertToHtml(inputStream, Path.GetFileName(inputFile), outputHandler);
        
        logger.LogInformation($"Successfully converted {inputFile}");
    }
    catch (Exception ex)
    {
        logger.LogError(ex, $"Failed to convert {inputFile}");
        throw;
    }
}
 عربي