이메일 형식 변환기 .NET

Aspose.Email LowCode Converter는 최소한의 코드 복잡성으로 다양한 형식 사이의 이메일 메시지를 변환하기위한 단순화되고 고급 API를 제공합니다.이 개발자 가이드는 핵심 기능, 구현 패턴 및 .NET 응용 프로그램에서 컨버터를 사용하는 최상의 관행을 다루고 있습니다.

아스포스.email.LowCode

그들의 Aspose.Email.LowCode namespace는 이메일 형식 변환 작업을 단순화하도록 설계된 클래스를 포함합니다 Converter 클래스는 EML, MSG, HTML, MHT 및 MHTML을 포함한 인기 형식 사이의 이메일 메시지를 변환하는 정적 방법을 제공합니다.

핵심 구성 요소

  • Converter : 이메일 형식 변환을위한 정적 전환 방법
  • IOutputHandler : 변환 출력 스트림 처리 인터페이스
  • FolderOutputHandler : 폴더 기반 출력 저장에 대한 내장된 구현

시작하기

설치

NuGet Package Manager를 통해 Aspose.Email 패키지를 설치하십시오:

Install-Package Aspose.Email

Namespace 선언문

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 형식으로 변환

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

MSG 형식으로 변환

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

EML 형식으로 변환

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

사용자 지정 수출 매니저

실행을 위한 The 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);
    }
}

지원 형식 매트릭스

입력 형식출력 형식방법
EMLHTML, MSG, MHTML 및 MHTConvertToHtml(), ConvertToMsg(), 그리고 등등.
MSGHTML, EML, MHTML 및 MHTConvertToHtml(), ConvertToEml(), 그리고 등등.
모든 이메일 형식사용자 지정Convert() 출력 유형 파라미터

고급 구현 패턴

배치 처리 실행

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
}

성과 고려 사항

Asynchronous 작업

모든 변환 방법 반환 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 코어 웹 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 서비스 구현

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입력 파일에 대한 유효한 이메일 형식을 보장

데뷔 팁

문제 해결을위한 자세한 로그링을 허용합니다:

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;
    }
}
 한국어