C# Outlook 自動化範例解析|郵件讀取程式碼完整說明|C# 自動化系列

更新 發佈閱讀 14 分鐘

在了解基本操作後,本篇將進一步解析 C# Outlook 自動化範例,詳細說明郵件讀取的程式碼與邏輯流程,讓你可以依需求修改與擴充,打造屬於自己的 Email 自動化工具。

開始範例程式碼解析

1 . 開啟 C# 讀取 Outlook 郵件教學|Email 自動化完整實作|C# 自動化系列 建立的程式

vocus|新世代的創作平台

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

程式碼片段:

  1. try
  2. {

-------------------------------------------------------------------------------------------------------

第 1 、2 行是使用asp.net 裡面自己內建的語法,會對try的大括號內的程式碼做錯誤的測試,當有發生錯誤時會自動跳出大括號不會繼續執行程式,可以防止讓整個程式掛掉。

(目前不深入講解try,只要知道會防止程式掛掉即可,後續對程式熟悉後再深入探討。)

程式碼片段:

  1. string savePath = @"C:\MailAttachments\";
  2. if (!Directory.Exists(savePath))
  3. Directory.CreateDirectory(savePath);

-------------------------------------------------------------------------------------------------------

第 1 行 我們新增一個名稱為 savePath 的字串容器,並且把等一下要存放附件的位置放進去。

第 2 行 Directory.Exists是.net的內建語法,可以判斷這個資料夾存不存在,存在就會回傳true 不存在回傳false。

我們用if來做判斷,!(驚嘆號) 就是反向(或是說不等於)的意思,這整段的邏輯就是 假設資料夾不存在 就進入第 3 行 執行, 如果存在就不會去執行第 3 行。

第 3 行 Directory.CreateDirectory是.net的內建語法,會幫你建立資料夾,我們只要把savePath丟進去,就會幫你在你給的路徑建立好資料夾。執行完就會如下圖在C槽出現一個MailAttachments的資料夾。

vocus|新世代的創作平台

程式碼片段:

  1. Outlook.Application outlookApp = new Outlook.Application();
  2. Outlook.NameSpace outlookNs = outlookApp.GetNamespace("MAPI");
  3. outlookNs.Logon("", "", true, true);
  4. Outlook.MAPIFolder inbox = outlookNs.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);

-------------------------------------------------------------------------------------------------------

第 1 - 3 行 這些都是 Outlook 套件要用來讀取mail的固定格式,照著建立就可以了。

第 4 行 也是套件的固定用法,如同程式碼字面上的意思outlookNs.GetDefaultFolder 用我們建立好的Outlook元件,去取得信件存放的Folder(資料夾),這樣就能把所有的信件取出來。


*補充: 這邊看不懂沒關係,這只是套件的固定用法,每次要用就上GPT查一下就可以複製下來用了,程式寫久了自然就看懂了,還是鼓勵不要糾結,先以功能做出來為主。

程式碼片段:

  1. foreach (Outlook.MailItem mail in inbox.Items)
  2. {

-------------------------------------------------------------------------------------------------------

第 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 前面的 暫時的容器 ,並且在大括號內就可以使用這個 暫時的容器

程式碼片段:

  1. if (mail.Attachments.Count > 0)
  2. {

-------------------------------------------------------------------------------------------------------

第 1 行 每次迴圈取得的mail容器,裡面有一個Attachments容器裝信件裡面的所有附件檔案,我們判斷當Attachments 裡面的Count(數量) 有大於0的話才代表有附件,這時才會滿足我們 if 的判斷條件進入 第 2 行 大括號內去取得附件。

*補充: .net 裡面這種 裝很多容器的大箱子 基本上都會有 Count 這個值讓你查詢裡面到底放了多少容器。 這是很基本的Common sense 用久了要記得喔!

程式碼片段:

  1. foreach (Outlook.Attachment att in mail.Attachments)
  2. {
  3. string fileName = Path.Combine(savePath, att.FileName);
  4. att.SaveAsFile(fileName);
  5. Console.WriteLine("Downloaded: " + fileName);
  6. }

-------------------------------------------------------------------------------------------------------

當前面步驟判斷 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的值,除了在過程中可以知道程式有在運作,還可以順便知道下載了哪些檔案。 這行可有可無,只是輸出訊息不會影響功能,沒有這行也可以等程式結束後再去資料夾看有下載哪些檔案即可。

程式碼片段:

  1. MessageBox.Show("附件下載完成!");

-------------------------------------------------------------------------------------------------------

第 1 行 MessageBox.Show是.net windows Form的語法,會彈出一個訊息框提示,這邊我們放在整個下載功能的最後,當下載都跑完時提示 "附件下載完成!" ,我們就知道下載完成了!

程式碼片段:

  1. catch (Exception ex)
  2. {
  3. MessageBox.Show("錯誤:" + ex.Message);
  4. }

-------------------------------------------------------------------------------------------------------

第 1 行 catch (Exception ex) 這就是我最一開始說的 Try Catch的用法,可以防止程式錯誤時整個掛掉,目前我們只要知道在Try的大括號 {} 內有發生錯誤就會跳進來 catch {}的大括號內,catch可以做一些錯誤處理。之後程式功力深一點後我們再來深入探討。

結論

我們這次的範例程式碼就已經滿足幫老闆把Outlook信件中的所有附件下載下來,因此不用特別去做程式碼的調整。 foreach 迴圈在前面幾個章節都沒用到,但我們前面有教過 for 迴圈, foreach 迴圈 其實也可以改用 for 迴圈。

你會慢慢發現程式的寫法有百百種,都可以達到需求,就看你要用什麼方法,這是我認為寫程式的一個很棒的優點,你可以有很多種方法來解決一個事情,你的邏輯、觀點等等會變得很廣很全面,不會再被想法給侷限,你會變得更有自信。

留言
avatar-img
ITT Fun
0會員
15內容數
主要內容會教大家如何快速有效轉職到中大型公司內部系統的軟體工程師。 程式真的沒有很困難,不論之前覺得學習太枯燥乏味或是其他因素而放棄或從未開始,這邊會帶給大家不同的體驗。 我們會用實際案例來當作教學主軸,用我親身的經歷讓大家快樂學習程式,過程中可以累積很多程式作品還會提升很多成就感,同時還能增加成功轉職的機會!
ITT Fun的其他內容
2026/04/07
使用 C# 讀取 Outlook 郵件,可以實現許多自動化流程,例如自動下載附件或整理信件。本篇將帶你完成 Outlook 郵件讀取教學,並實作 Email 自動化流程,讓你減少重複性工作,提高工作效率。
Thumbnail
2026/04/07
使用 C# 讀取 Outlook 郵件,可以實現許多自動化流程,例如自動下載附件或整理信件。本篇將帶你完成 Outlook 郵件讀取教學,並實作 Email 自動化流程,讓你減少重複性工作,提高工作效率。
Thumbnail
2026/04/02
當資料不同時,C# Excel 程式的結構與邏輯就會非常重要。本篇將分享 C# Excel 資料處理優化的技巧,包含邏輯設計與程式結構改善,幫助你從「能用」進階到「符合客製化需求」。
Thumbnail
2026/04/02
當資料不同時,C# Excel 程式的結構與邏輯就會非常重要。本篇將分享 C# Excel 資料處理優化的技巧,包含邏輯設計與程式結構改善,幫助你從「能用」進階到「符合客製化需求」。
Thumbnail
2026/03/31
當你已經了解如何讀取 Excel,接下來最重要的是看懂程式碼。本篇將針對 C# 讀取 Excel 的完整範例進行解析,逐步說明 NPOI 程式碼的運作方式,幫助你真正理解每一段邏輯,而不是只會複製貼上。
Thumbnail
2026/03/31
當你已經了解如何讀取 Excel,接下來最重要的是看懂程式碼。本篇將針對 C# 讀取 Excel 的完整範例進行解析,逐步說明 NPOI 程式碼的運作方式,幫助你真正理解每一段邏輯,而不是只會複製貼上。
Thumbnail
看更多
你可能也想看
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
網路上提到自學程式的文章,都會說自學程式非常地辛苦,而且要很自律,決心夠強;而當自己踏上這條路後,才發現何止是辛苦,根本是佈滿荊棘,常常寸步難行,且被刺地遍體鱗傷(喂~是不是有點太浮誇了),但在每個寫出程式豁然開朗的當下,卻又成就感滿滿,所以想藉著寫部落格紀錄一下自己的學習過程!
Thumbnail
網路上提到自學程式的文章,都會說自學程式非常地辛苦,而且要很自律,決心夠強;而當自己踏上這條路後,才發現何止是辛苦,根本是佈滿荊棘,常常寸步難行,且被刺地遍體鱗傷(喂~是不是有點太浮誇了),但在每個寫出程式豁然開朗的當下,卻又成就感滿滿,所以想藉著寫部落格紀錄一下自己的學習過程!
Thumbnail
前言:重新定義「被取代」的真正意涵 當我們談論 AI 將在 2030 年「取代」軟體工程師時,這個論述往往過於簡化了一個複雜的轉型過程。真正的問題不是 AI 是否會取代程式設計師,而是哪些工程師會被淘汰,哪些會成為下一代的技術領導者。 歷史告訴我們,每一次技術革命都會重新定義職業的本質,而非簡單
Thumbnail
前言:重新定義「被取代」的真正意涵 當我們談論 AI 將在 2030 年「取代」軟體工程師時,這個論述往往過於簡化了一個複雜的轉型過程。真正的問題不是 AI 是否會取代程式設計師,而是哪些工程師會被淘汰,哪些會成為下一代的技術領導者。 歷史告訴我們,每一次技術革命都會重新定義職業的本質,而非簡單
Thumbnail
若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。
Thumbnail
若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。
Thumbnail
曾經因為工作上的衝突,體驗到被甲方的語言攻擊與情緒勒索的不適,引發我思索如何改變現況。朋友的建議點燃了我嘗試轉職的火苗:成為具有專業技能且不受他人左右的自己。由於在資訊服務產業從事PM工作,自然聯想到專注於程式碼的工程師,他們在工作上相對具有專業技能,更不受甲方干擾。
Thumbnail
曾經因為工作上的衝突,體驗到被甲方的語言攻擊與情緒勒索的不適,引發我思索如何改變現況。朋友的建議點燃了我嘗試轉職的火苗:成為具有專業技能且不受他人左右的自己。由於在資訊服務產業從事PM工作,自然聯想到專注於程式碼的工程師,他們在工作上相對具有專業技能,更不受甲方干擾。
Thumbnail
要轉換到另一個領域,需要投入相當的時間,一旦準備的時間拉得越長,轉職要面臨的壓力也就可能隨之增加。 這次就將 Podcast 先前邀請到多位軟體工程師分享的轉職經驗彙整成整理包,讓大家可以更快找到自己需要的轉職資訊,把更多時間留在提升專業技能上!
Thumbnail
要轉換到另一個領域,需要投入相當的時間,一旦準備的時間拉得越長,轉職要面臨的壓力也就可能隨之增加。 這次就將 Podcast 先前邀請到多位軟體工程師分享的轉職經驗彙整成整理包,讓大家可以更快找到自己需要的轉職資訊,把更多時間留在提升專業技能上!
Thumbnail
全新版本的《三便士歌劇》如何不落入「復刻經典」的巢臼,反而利用華麗的秀場視覺,引導觀眾在晚期資本主義的消費愉悅之中,而能驚覺「批判」本身亦可能被收編——而當絞繩升起,這場關於如何生存的黑色遊戲,又將帶領新時代的我們走向何種後現代的自我解構?
Thumbnail
全新版本的《三便士歌劇》如何不落入「復刻經典」的巢臼,反而利用華麗的秀場視覺,引導觀眾在晚期資本主義的消費愉悅之中,而能驚覺「批判」本身亦可能被收編——而當絞繩升起,這場關於如何生存的黑色遊戲,又將帶領新時代的我們走向何種後現代的自我解構?
Thumbnail
長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。
Thumbnail
長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News