แปลงและแปลงข้อความด้วยโค้ดขั้นต่ำ

การแปลงอีเมลเคยหมายถึงการโหลดเข้าไปใน MailMessage, เลือก SaveOptions, ต่อสตรีม, และจดจำว่ารูปแบบต้องการสวิตช์ใด คำสั่ง Aspose.Email.LowCode namespace ยุบทั้งหมดลงในเมธอดสแตติกเดียว คุณให้สตรีม, ชื่อไฟล์, และรูปแบบที่ต้องการ — มันคำนวนที่เหลือและเขียนผลลัพธ์ไปที่คุณบอก5899c1__](../src/LowCodeEmailConversion) โปรเจกต์ที่มาพร้อมกับมัน

ทำไมต้องใช้ namespace "low-code"?

Aspose.Email.LowCode เป็นพื้นผิวที่บางและเน้นงานเหนือ API อีเมลเต็ม มันมีไว้สำหรับกรณี 80% — "ฉันแค่ต้องการแปลงข้อความนี้เป็นรูปแบบนั้น" — ที่คุณไม่ต้องคิดถึงโมเดลข้อความ, MIME, หรือตัวเลือกการเก็บ

มันสร้างขึ้นรอบสามประเภท:

| ประเภท | บทบาท | | — | — | | Converter | เมธอดสแตติกที่ทำการแปลง | |94b97d5590014b04_IOutputHandler) เป็นแนวคิดการออกแบบหลัก: การแปลงบรรทัดเดียวเดียวกันสามารถเป้าหมายไปยังดิสก์, หน่วยความจำ, ฐานข้อมูล, ถังคลาวด์ หรือการตอบสนอง HTTP เพียงสลับตัวจัดการ

API ตัวแปลงโดยย่อ

ทุกเมธอดเป็น static, ส่งคืน Task, และมีรูปแบบเดียวกัน:

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

| พารามิเตอร์ | ความหมาย | | — | — | | input | ข้อความแหล่งเป็น Stream (ไฟล์, การอัปโหลด, บัฟเฟอร์หน่วยความจำ…) | | nameWithExtension | ชื่อไฟล์ต้นฉบับ เช่น "message.msg". ส่วนต่อขยายบอกตัวแปลงรูปแบบแหล่งข้อมูล ดังนั้นต้องแม่นยำ | | handler | ตัว IOutputHandler ที่รับสตรีมผลลัพธ์ที่แปลงแล้ว | | outputType | (เฉพาะการอับโหลดช่วงรันไทม์) รูปแบบเป้าหมายเป็นสตริง |

รูปแบบแหล่งที่รองรับคือ EML และ MSG; รูปแบบเป้าหมายที่รองรับคือ EML, MSG, HTML, MHT, และ MHTML.

หมายเหตุ: เมธอดเหล่านี้เป็นแบบอะซิงโครนัส — ต้อง await พวกมัน ตัวแปลง > เขียนไปยังตัวจัดการเป็นส่วนหนึ่งของงานนั้น ดังนั้นผลลัพธ์จึงไม่รับประกันว่าจะถูก > ล้างจนกว่าจะคืนค่า Task เสร็จสมบูรณ์

การตรวจจับการแปลงอัตโนมัติ

Convert อ่านส่วนต่อขยายของ nameWithExtension, ตรวจจับรูปแบบแหล่งข้อมูล และสร้างผลลัพธ์ตามที่ต้องการ outputType คุณขอ นี่คือจุดเริ่มต้นที่ยืดหยุ่นที่สุดเมื่อรูปแบบเป้าหมายถูกตัดสินในเวลารัน (เช่น จากการป้อนของผู้ใช้หรือการตั้งค่า)

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

เมื่อปลายทางถูกกำหนดและทราบล่วงหน้า ให้ใช้วิธีที่ชัดเจนและบ่งบอกเจตนา ConvertToEml แปลง Outlook .msg เป็น RFC 822 มาตรฐาน .eml:

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

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

EML → MSG

ทิศทางตรงกันข้าม ใช้ ConvertToMsg เมื่อแอปพลิเคชันหรือผู้รับคาดหวังรายการ Outlook แบบดั้งเดิม:

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

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

อีเมล → HTML

ConvertToHtml แสดงข้อความเป็นเอกสาร HTML แบบอิสระ — เหมาะสำหรับพรีวิวอีเมลในเบราว์เซอร์หรือฝังในเว็บเพจ รองรับได้ทั้ง .eml หรือ .msg อินพุต:

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

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

อีเมล → MHT และ MHTML

ทั้งสองรูปแบบบรรจุเนื้อหาอีเมลและทรัพยากรของมันไว้ในไฟล์เว็บ-อาร์ไคฟ์เดียว ซึ่งสะดวกต่อการเก็บหรือแชร์สแนปช็อตที่เป็นอิสระ MHTML เป็นรูปแบบที่มีความสมบูรณ์มากกว่าและมักจะรักษาหัวเรื่องอีเมล (From / To / Subject / Date) ในผลลัพธ์ที่แสดง

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

แปลงเฉพาะเมื่อจำเป็น

ConvertEmlOrMsg แปลงอินพุตเป็นรูปแบบที่ร้องขอ ก็ต่อเมื่อมันยังไม่อยู่ในรูปแบบนั้น ชี้ไปที่กองไฟล์ผสมของ .eml และ .msg ไฟล์และขอให้ "eml": ส่วน .eml ไฟล์ผ่านไป, ส่วน .msg ไฟล์ถูกแปลง — โดยที่คุณไม่ต้องแยกสาขาตามส่วนขยายเอง สิ่งนี้ทำให้เหมาะกับการ ทำให้เป็นมาตรฐาน ของกล่องขาเข้าที่เป็นรูปแบบเดียว

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

การแปลงหลายไฟล์ในโฟลเดอร์

เพราะการแปลงแต่ละครั้งเป็นเพียงการเรียกเมธอดหนึ่ง การทำงานเป็นชุดใหญ่ต้องการโค้ดเกือบไม่มีเพิ่มเติม — ให้วนไฟล์และใช้ตัวจัดการซ้ำ ที่นี่ทุกข้อความในโฟลเดอร์จะถูกแปลงเป็น 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");
}

เคล็ดลับ: FolderOutputHandler เขียนลงในโฟลเดอร์ที่ มีอยู่ อยู่แล้วแต่ไม่สร้างมันขึ้นมา เรียก Directory.CreateDirectory(...) เป็นอันดับแรก การให้แหล่งข้อมูลแต่ละอันมีโฟลเดอร์ย่อยของตัวเองยังช่วยป้องกันการชนกันเมื่อหลายข้อความมีชื่อฐานเดียวกัน (สอง message.* ไฟล์ทั้งสองจะต้องการเขียน message.html).

การส่งออกผลลัพธ์ไปยังที่อื่นที่ไม่ใช่ดิสก์

นี่คือที่ที่ IOutputHandler การสกัดนามธรรมให้ผลตอบแทน อินเตอร์เฟสเล็ก ๆ นี้:

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

คอนเวอร์เตอร์เรียกหนึ่งในโอเวอร์โหลดเหล่านี้พร้อมชื่อไฟล์ผลลัพธ์และนักเขียน การนำไปใช้ของคุณต้องให้ Stream และตัดสินใจว่าจะทำอะไรกับไบต์ ตัวจัดการที่จับทุกอย่างในหน่วยความจำมีลักษณะดังนี้:

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();
    }
}

การเรียกการแปลงเองไม่เปลี่ยนแปลง — มีเพียงตัวจัดการที่ต่างกัน:

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...

จากที่นี่เป็นขั้นตอนสั้น ๆ ไปยัง Stream-to-cloud หรือ Stream-to-HTTP-response handler.

การเลือกวิธีที่เหมาะสม

| Goal | Use | | — | — | | รูปแบบเป้าหมายทราบในเวลาคอมไพล์ | ConvertToEml / ConvertToMsg / ConvertToHtml / ConvertToMht / ConvertToMhtml | | รูปแบบเป้าหมายกำหนดในเวลารัน | Convert(..., outputType) | | ปรับไฟล์ให้เป็นมาตรฐาน ข้ามไฟล์ที่มีรูปแบบเป้าหมายแล้ว | ConvertEmlOrMsg(..., outputType) | | เขียนผลลัพธ์ไปยังโฟลเดอร์ | FolderOutputHandler | | เขียนผลลัพธ์ไปยังหน่วยความจำ / คลาวด์ / HTTP / ฐานข้อมูล | ตัวกำหนดเอง IOutputHandler |