在了解基本操作後,本篇將進一步解析 C# Outlook 自動化範例,詳細說明郵件讀取的程式碼與邏輯流程,讓你可以依需求修改與擴充,打造屬於自己的 Email 自動化工具。
開始範例程式碼解析
1 . 開啟 C# 讀取 Outlook 郵件教學|Email 自動化完整實作|C# 自動化系列 建立的程式

2 . 程式碼研究
我們找到button1按下會執行的程式碼,開始一行一行解讀。
private void button1_Click(object sender, EventArgs e)
{
try
{
string savePath = @"C:\MailAttachments\";
if (!Directory.Exists(savePath))
Directory.CreateDirectory(savePath);
// 啟動 Outlook Application COM 物件
Outlook.Application outlookApp = new Outlook.Application();
Outlook.NameSpace outlookNs = outlookApp.GetNamespace("MAPI");
outlookNs.Logon("", "", true, true);
// 讀取收件匣
Outlook.MAPIFolder inbox = outlookNs.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
foreach (Outlook.MailItem mail in inbox.Items)
{
if (mail.Attachments.Count > 0)
{
foreach (Outlook.Attachment att in mail.Attachments)
{
string fileName = Path.Combine(savePath, att.FileName);
att.SaveAsFile(fileName);
Console.WriteLine("Downloaded: " + fileName);
}
}
}
MessageBox.Show("附件下載完成!");
}
catch (Exception ex)
{
MessageBox.Show("錯誤:" + ex.Message);
}
}
程式碼片段:
- try
- {
-------------------------------------------------------------------------------------------------------
第 1 、2 行是使用asp.net 裡面自己內建的語法,會對try的大括號內的程式碼做錯誤的測試,當有發生錯誤時會自動跳出大括號不會繼續執行程式,可以防止讓整個程式掛掉。
(目前不深入講解try,只要知道會防止程式掛掉即可,後續對程式熟悉後再深入探討。)
程式碼片段:
- string savePath = @"C:\MailAttachments\";
- if (!Directory.Exists(savePath))
- Directory.CreateDirectory(savePath);
-------------------------------------------------------------------------------------------------------
第 1 行 我們新增一個名稱為 savePath 的字串容器,並且把等一下要存放附件的位置放進去。
第 2 行 Directory.Exists是.net的內建語法,可以判斷這個資料夾存不存在,存在就會回傳true 不存在回傳false。
我們用if來做判斷,!(驚嘆號) 就是反向(或是說不等於)的意思,這整段的邏輯就是 假設資料夾不存在 就進入第 3 行 執行, 如果存在就不會去執行第 3 行。
第 3 行 Directory.CreateDirectory是.net的內建語法,會幫你建立資料夾,我們只要把savePath丟進去,就會幫你在你給的路徑建立好資料夾。執行完就會如下圖在C槽出現一個MailAttachments的資料夾。

程式碼片段:
- Outlook.Application outlookApp = new Outlook.Application();
- Outlook.NameSpace outlookNs = outlookApp.GetNamespace("MAPI");
- outlookNs.Logon("", "", true, true);
- Outlook.MAPIFolder inbox = outlookNs.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
-------------------------------------------------------------------------------------------------------
第 1 - 3 行 這些都是 Outlook 套件要用來讀取mail的固定格式,照著建立就可以了。
第 4 行 也是套件的固定用法,如同程式碼字面上的意思outlookNs.GetDefaultFolder 用我們建立好的Outlook元件,去取得信件存放的Folder(資料夾),這樣就能把所有的信件取出來。
*補充: 這邊看不懂沒關係,這只是套件的固定用法,每次要用就上GPT查一下就可以複製下來用了,程式寫久了自然就看懂了,還是鼓勵不要糾結,先以功能做出來為主。
程式碼片段:
- foreach (Outlook.MailItem mail in inbox.Items)
- {
-------------------------------------------------------------------------------------------------------
第 1 行 前面我們取得了存放信件的資料夾inbox,inbox裡面有一個items的容器,items 裡面就是存放了你信箱裡所有的信件,所以我們用 foreach迴圈 這個原本.net的語法 ,對items這個容器去取出裡面每一個元件直到最後一個,items裡面的每一個元件都是MailItem 的格式,所以我們每次都用一個,格式為 Outlook.MailItem 名稱為 mail 的容器去裝從items取出的元件。
取出後就去執行 第 2 行 大括號裡面的動作,直到取到items最後一個元件後才會跳出這個foreach的迴圈。
*補充:
MailItem 就是 Outlook 信件的格式,裡面會有信件的內容,包含信件的Title、Subject、mailTo、CC、Attachment等等。
*補充:
foreach( 暫時的容器 in 某個裝很多容器的大箱子 ) 這是整個foreach的固定使用格式,每次會從 某個裝很多容器的大箱子 裡面依據順序抓出一個容器,放進 in 前面的 暫時的容器 ,並且在大括號內就可以使用這個 暫時的容器。
程式碼片段:
- if (mail.Attachments.Count > 0)
- {
-------------------------------------------------------------------------------------------------------
第 1 行 每次迴圈取得的mail容器,裡面有一個Attachments容器裝信件裡面的所有附件檔案,我們判斷當Attachments 裡面的Count(數量) 有大於0的話才代表有附件,這時才會滿足我們 if 的判斷條件進入 第 2 行 大括號內去取得附件。
*補充: .net 裡面這種 裝很多容器的大箱子 基本上都會有 Count 這個值讓你查詢裡面到底放了多少容器。 這是很基本的Common sense 用久了要記得喔!
程式碼片段:
- foreach (Outlook.Attachment att in mail.Attachments)
- {
- string fileName = Path.Combine(savePath, att.FileName);
- att.SaveAsFile(fileName);
- Console.WriteLine("Downloaded: " + fileName);
- }
-------------------------------------------------------------------------------------------------------
當前面步驟判斷 mail 容器有Attachment,我們就會執行這邊的程式碼。
第 1 行 我們開始對mail容器裡面的所有Attachments一個一個取出。foreach每次取出的att容器是Attachment格式,Attachment就是Outlook附件的格式。裡面有所有關於附件的資訊,例如: 檔案名稱等等。
第 3 行 我們先用一個字串容器fileName來放附件等一下要存放的路徑。 Path.Combine 是.net 原本的語法,如同字面的意思它就是把路徑幫你結合,我們的sabePath 是 C:\MailAttachments\,att.FileName 就是取得附件的檔名假設是test.doc,程式就會幫你把這兩個組合起來變成C:\MailAttachments\test.doc。
第 4 行 att.SaveAsFile這是Outlook套件提供的方法,會幫你把附件檔案存到你指定的路徑,我們這邊把 第 3 行 的路徑 fileName丟給它,附件就會被儲存到C:\MailAttachments\test.doc。
第 5 行 Console.WriteLine這個前面的章節講過了,忘記也沒關係,這只是.net的語法,可以輸出資訊到輸出框讓你知道程式有在運作,這邊我們輸出 fileName的值,除了在過程中可以知道程式有在運作,還可以順便知道下載了哪些檔案。 這行可有可無,只是輸出訊息不會影響功能,沒有這行也可以等程式結束後再去資料夾看有下載哪些檔案即可。
程式碼片段:
- MessageBox.Show("附件下載完成!");
-------------------------------------------------------------------------------------------------------
第 1 行 MessageBox.Show是.net windows Form的語法,會彈出一個訊息框提示,這邊我們放在整個下載功能的最後,當下載都跑完時提示 "附件下載完成!" ,我們就知道下載完成了!
程式碼片段:
- catch (Exception ex)
- {
- MessageBox.Show("錯誤:" + ex.Message);
- }
-------------------------------------------------------------------------------------------------------
第 1 行 catch (Exception ex) 這就是我最一開始說的 Try Catch的用法,可以防止程式錯誤時整個掛掉,目前我們只要知道在Try的大括號 {} 內有發生錯誤就會跳進來 catch {}的大括號內,catch可以做一些錯誤處理。之後程式功力深一點後我們再來深入探討。
結論
我們這次的範例程式碼就已經滿足幫老闆把Outlook信件中的所有附件下載下來,因此不用特別去做程式碼的調整。 foreach 迴圈在前面幾個章節都沒用到,但我們前面有教過 for 迴圈, foreach 迴圈 其實也可以改用 for 迴圈。
你會慢慢發現程式的寫法有百百種,都可以達到需求,就看你要用什麼方法,這是我認為寫程式的一個很棒的優點,你可以有很多種方法來解決一個事情,你的邏輯、觀點等等會變得很廣很全面,不會再被想法給侷限,你會變得更有自信。















