0%

[DotnetCore]Reader系列-EML檔案

前提情要

筆者公司其他同仁負責的專案有一個需求是,主動幫使用者的信件內容讀取,依照附件檔案中的檔案內容做不同的事情,而不用人工的方式到系統中上傳該附件檔案。這時候就該使出Reader系列文章的時候了,前置作業可能要靠其他Infra同仁設定好後將信件自動轉成EML檔案格式,放置於網路空間上,由EML Reader會去讀取該路經中的EML檔案,並做對應的事,該篇就以讀取EML檔案格式內容為主作呈現。

內容

筆者找到套件名為https://github.com/Sicos1977/MSGReader,為示範,筆者會使用https://www.phpclasses.org/browse/file/14672.html此網址中的eml檔案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void Main()
{
var fileInfo = new FileInfo(@"{path}\Downloads\test_sample_message.eml");
var eml = MsgReader.Mime.Message.Load(fileInfo);

// 撈出收件者
if (eml.Headers != null)
{
if (eml.Headers.To != null)
{
foreach (var recipient in eml.Headers.To)
{
var to = recipient.Address;
to.Dump();
}
}
}

// 撈出信件主旨
var subject = eml.Headers.Subject;
subject.Dump();

// 撈出信件內容(一般文字格式)
if (eml.TextBody != null)
{
var textBody = System.Text.Encoding.UTF8.GetString(eml.TextBody.Body);
textBody.Dump();
}

// 撈出信件內容(html格式)
if (eml.HtmlBody != null)
{
var htmlBody = System.Text.Encoding.UTF8.GetString(eml.HtmlBody.Body);
htmlBody.Dump();
}

// 撈出附件並存檔至本機目錄中
foreach (var attach in eml.Attachments)
{
$"AttachFileName: {attach.FileName}".Dump();
var filePath = @$"D:\{attach.FileName}";
using var fs = new FileStream(filePath, FileMode.Create);
attach.Save(fs);
}
}

讀取的結果如下

也可以在指定的D槽中看到附件檔案

結論

依照套件github上面的說明範例code,滿簡單易懂的,照著刻應該都做得出來,接著讀取解析attach檔案內容後,接著做對應的商業邏輯,完美。

參考