Chuyển Đổi và Biến Đổi Tin Nhắn Với Ít Mã Hơn

Chuyển đổi một email trước đây có nghĩa là tải nó vào một MailMessage, chọn đúng SaveOptions, kết nối các luồng, và nhớ định dạng nào cần công tắc nào. The Aspose.Email.LowCode không gian tên tập hợp tất cả vào một lời gọi tĩnh duy nhất. Bạn đưa cho nó một luồng, tên tệp, và định dạng bạn muốn — nó tự giải quyết phần còn lại và ghi kết quả tới bất kỳ nơi nào bạn chỉ định.5899c1__](../src/LowCodeEmailConversion) dự án đi kèm với nó.

Tại sao lại có không gian tên "low-code"?

Aspose.Email.LowCode là một giao diện mỏng, hướng nhiệm vụ trên toàn bộ API email. Nó tồn tại cho trường hợp 80% — "Tôi chỉ cần chuyển đổi tin nhắn này sang định dạng đó" — nơi bạn không muốn suy nghĩ về mô hình tin nhắn, MIME, hoặc các tùy chọn lưu trữ.

Nó được xây dựng quanh ba loại:

| Loại | Vai trò | | — | — | | Converter | Phương thức tĩnh thực hiện việc chuyển đổi. | |94b97d5590014b04_IOutputHandler) là ý tưởng thiết kế chính: chuyển đổi một dòng có thể nhắm tới đĩa, bộ nhớ, cơ sở dữ liệu, bucket đám mây, hoặc phản hồi HTTP chỉ bằng cách hoán đổi trình xử lý.

API Trình Chuyển Đổi trong một cái nhìn

Mỗi phương pháp là static, trả về một Task, và theo cùng một dạng:

Task Converter.ConvertToEml  (Stream input, string nameWithExtension, IOutputHandler handler);
Task Converter.ConvertToMsg  (Stream input, string nameWithExtension, IOutputHandler handler);
Task Converter.ConvertToHtml (Stream input, string nameWithExtension, IOutputHandler handler);
Task Converter.ConvertToMht  (Stream input, string nameWithExtension, IOutputHandler handler);
Task Converter.ConvertToMhtml(Stream input, string nameWithExtension, IOutputHandler handler);

// Format chosen at run time via the outputType string ("eml", "msg", "html", ...):
Task Converter.Convert        (Stream input, string nameWithExtension, IOutputHandler handler, string outputType);
Task Converter.ConvertEmlOrMsg(Stream input, string nameWithExtension, IOutputHandler handler, string outputType);

| Tham số | Ý nghĩa | | — | — | | input | Tin nhắn nguồn dưới dạng Stream (một tệp, một tải lên, một bộ nhớ đệm…). | | nameWithExtension | Tên tệp gốc, ví dụ, "message.msg". Phần mở rộng cho Trình Chuyển Đổi biết định dạng nguồn, vì vậy nó phải chính xác. | | handler | The IOutputHandler được nhận đầu vào luồng đầu ra đã chuyển đổi. | | outputType | (Chỉ các overload thời gian chạy) định dạng đích dưới dạng chuỗi. |

Các định dạng nguồn được hỗ trợ là EMLMSG; các định dạng đích được hỗ trợ là EML, MSG, HTML, MHT, và MHTML.

Lưu ý: các phương pháp này là bất đồng bộ — luôn luôn await chúng. Trình Chuyển Đổi > ghi vào trình xử lý như một phần của nhiệm vụ đó, vì vậy đầu ra không được đảm bảo > được xả cho tới khi trả về Task hoàn thành.

Tự động phát hiện chuyển đổi

Convert đọc phần mở rộng của nameWithExtension, phát hiện định dạng nguồn, và tạo ra bất kỳ outputType bạn yêu cầu. Đây là điểm vào linh hoạt nhất khi định dạng đích được quyết định tại thời gian chạy (ví dụ, từ đầu vào người dùng hoặc cấu hình).

using Aspose.Email.LowCode;

using FileStream input = File.OpenRead("message.msg");
var handler = new FolderOutputHandler(@"C:\output\auto");

await Converter.Convert(input, "message.msg", handler, "eml");

MSG → EML

Khi đích đến được cố định và biết trước tại thời điểm biên dịch, hãy ưu tiên phương pháp rõ ràng, thể hiện ý định. ConvertToEml chuyển một Outlook .msg vào một RFC 822 tiêu chuẩn .eml:

using FileStream input = File.OpenRead("message.msg");
var handler = new FolderOutputHandler(@"C:\output\eml");

await Converter.ConvertToEml(input, "message.msg", handler);

EML → MSG

Hướng ngược lại. Sử dụng ConvertToMsg khi một ứng dụng hoặc người nhận mong đợi các mục Outlook gốc:

using FileStream input = File.OpenRead("message.eml");
var handler = new FolderOutputHandler(@"C:\output\msg");

await Converter.ConvertToMsg(input, "message.eml", handler);

Email → HTML

ConvertToHtml render một tin nhắn dưới dạng tài liệu HTML độc lập — lý tưởng để xem trước email trong trình duyệt hoặc nhúng vào trang web. Nó chấp nhận cả .eml hoặc .msg đầu vào:

using FileStream input = File.OpenRead("message.eml");
var handler = new FolderOutputHandler(@"C:\output\html");

await Converter.ConvertToHtml(input, "message.eml", handler);

Email → MHT và MHTML

Cả hai định dạng đều gói nội dung tin nhắn và tài nguyên của nó vào một tệp web-archive duy nhất, thuận tiện cho việc lưu trữ hoặc chia sẻ bản sao chụp tự chứa. MHTML là biến thể phong phú hơn và thường bảo tồn các tiêu đề email (From / To / Subject / Date) trong đầu ra đã render.

// MHT
using (FileStream input = File.OpenRead("message.msg"))
    await Converter.ConvertToMht(input, "message.msg", new FolderOutputHandler(@"C:\output\mht"));

// MHTML
using (FileStream input = File.OpenRead("message.eml"))
    await Converter.ConvertToMhtml(input, "message.eml", new FolderOutputHandler(@"C:\output\mhtml"));

Chỉ chuyển đổi khi cần

ConvertEmlOrMsg chuyển đổi đầu vào sang định dạng yêu cầu chỉ nếu nó chưa ở định dạng đó. Đặt nó vào một đống hỗn hợp của .eml.msg các tệp và yêu cầu "eml": cái .eml các tệp đi qua, .msg các tệp được chuyển đổi — mà không cần bạn tự kiểm tra phần mở rộng. Điều này làm cho nó hoàn hảo cho việc chuẩn hóa hộp thư đến thành một định dạng duy nhất.

// .eml input requesting "eml" -> passes through
using (FileStream input = File.OpenRead("message.eml"))
    await Converter.ConvertEmlOrMsg(input, "message.eml", handler, "eml");

// .msg input requesting "eml" -> converted
using (FileStream input = File.OpenRead("message.msg"))
    await Converter.ConvertEmlOrMsg(input, "message.msg", handler, "eml");

Chuyển đổi hàng loạt một thư mục

Vì mỗi chuyển đổi chỉ là một lời gọi phương thức, việc mở rộng thành công việc hàng loạt hầu như không cần mã bổ sung — liệt kê các tệp và tái sử dụng trình xử lý. Ở đây mỗi tin nhắn trong một thư mục được chuyển đổi sang HTML:

foreach (string path in Directory.EnumerateFiles(inputDir)
             .Where(f => f.EndsWith(".eml") || f.EndsWith(".msg")))
{
    var handler = new FolderOutputHandler(Path.Combine(outputDir, Path.GetFileNameWithoutExtension(path)));
    using FileStream input = File.OpenRead(path);
    await Converter.Convert(input, Path.GetFileName(path), handler, "html");
}

Mẹo: FolderOutputHandler ghi vào một thư mục đã tồn tại nhưng không > tạo nó. Gọi Directory.CreateDirectory(...) đầu tiên. Đặt mỗi nguồn vào > thư mục con riêng cũng ngăn ngừa va chạm khi nhiều tin nhắn cùng chia sẻ một tên cơ sở > (hai message.* các tệp nếu không sẽ cùng muốn ghi message.html).

Gửi đầu ra tới một nơi khác ngoài đĩa

Đây là nơi IOutputHandler sự trừu tượng mang lại lợi ích. Giao diện rất nhỏ:

public interface IOutputHandler
{
    void AddOutputStream(string name, Action<Stream> writeAction);
    Task AddOutputStream(string name, Func<Stream, Task> writeActionAsync);
}

Trình chuyển đổi gọi một trong các overload này với tên tệp đầu ra và một writer. Việc triển khai của bạn cung cấp một Stream và quyết định cách xử lý các byte. Một trình xử lý nắm bắt mọi thứ trong bộ nhớ trông như sau:

public sealed class InMemoryOutputHandler : IOutputHandler
{
    private readonly Dictionary<string, byte[]> _files = new(StringComparer.OrdinalIgnoreCase);
    public IReadOnlyDictionary<string, byte[]> Files => _files;

    public void AddOutputStream(string name, Action<Stream> writeAction)
    {
        using var buffer = new MemoryStream();
        writeAction(buffer);
        _files[name] = buffer.ToArray();
    }

    public async Task AddOutputStream(string name, Func<Stream, Task> writeActionAsync)
    {
        using var buffer = new MemoryStream();
        await writeActionAsync(buffer);
        _files[name] = buffer.ToArray();
    }
}

Lệnh chuyển đổi tự nó không thay đổi — chỉ có trình xử lý khác:

var handler = new InMemoryOutputHandler();
using (FileStream input = File.OpenRead("message.msg"))
    await Converter.ConvertToHtml(input, "message.msg", handler);

byte[] html = handler.Files["message.html"]; // stream it, store it, return it...

Từ đây là một bước ngắn tới một Stream-đến-đám mây hoặc Stream-đến-trình xử lý phản hồi HTTP.

Chọn phương pháp phù hợp

| Mục tiêu | Sử dụng | | — | — | | Định dạng đích đã biết tại thời điểm biên dịch | ConvertToEml / ConvertToMsg / ConvertToHtml / ConvertToMht / ConvertToMhtml | | Định dạng đích được quyết định vào thời gian chạy | Convert(..., outputType) | | Chuẩn hoá tệp, bỏ qua những tệp đã ở định dạng đích | ConvertEmlOrMsg(..., outputType) | | Ghi kết quả vào một thư mục | FolderOutputHandler | | Ghi kết quả vào bộ nhớ / đám mây / HTTP / cơ sở dữ liệu | Một tùy chỉnh IOutputHandler |