在學會使用 C# SMTP 發送 Email 之後,下一步就是看懂實際的程式碼運作方式。本篇將針對 C# 發送 Email 範例 進行完整解析,從 SMTP 設定、寄信流程,到每一段程式碼的作用,帶你一步一步理解 .NET 寄信的核心邏輯。透過這篇教學,你不只是會用,還能真正掌握 C# SMTP 寄信的實作細節,並依需求進行修改與擴充。
本篇重點:
- ✔ C# SMTP 發送 Email 程式碼解析
- ✔ .NET 寄信流程完整說明
- ✔ 關鍵物件(SmtpClient / MailMessage)解析
開始範例程式碼解析
範例的功能:資料夾內檔案自動放到信件的附件寄出

1 . 開啟C# SMTP 發送 Email 教學|程式寄信完整實作(含範例)|C# 自動化系列 程式

2 . 程式碼研究
我們找到button1按下會執行的程式碼,開始一行一行解讀。
private void button1_Click(object sender, EventArgs e)
{
string folderPath = @"C:\BackUp";
using (MailMessage mail = new MailMessage())
using (SmtpClient smtp = new SmtpClient("smtp.office365.com", 587))
{
smtp.EnableSsl = true;
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.UseDefaultCredentials = false;
smtp.Credentials = new NetworkCredential("你的寄信帳號@xxx.com", "寄信帳號的密碼");
mail.From = new MailAddress("你的寄信帳號@xxx.com");
mail.To.Add("你的收件帳號@xxx.com");
mail.Subject = "測試寄送附件";
mail.Body = "這是從資料夾自動加入附件的測試郵件";
if (Directory.Exists(folderPath))
{
string[] files = Directory.GetFiles(folderPath);
foreach (string file in files)
{
Attachment attachment = new Attachment(file);
mail.Attachments.Add(attachment);
}
}
else
{
MessageBox.Show("資料夾不存在");
return;
}
try
{
smtp.Send(mail);
MessageBox.Show("寄信成功");
}
catch (Exception ex)
{
MessageBox.Show("寄信失敗:" + ex.Message);
}
}
}
程式碼片段:
string folderPath = @"C:\BackUp";using (MailMessage mail = new MailMessage())using (SmtpClient smtp = new SmtpClient("smtp.office365.com", 587)){
-------------------------------------------------------------------------------------------------------
第 1 行 宣告一個string(字串型態)的變數folderPath ,把要跟信件一起寄出的附件檔案存放的資料夾路徑,寫在這個變數裡面,等一下就能用這個變數找到檔案位置。
第 2 行 創建一個MailMessage類型的元件mail ,等等就可以把信件內容填到這個mail元件裡面,最後就可以寄出這個mail。
new MailMessage()是初始化的固定格式,.net 初始化元件的格式幾乎都長這樣,頂多類型帶不一樣而已。
using 是.net提供的用法,離開using的大括號後會自動幫你釋放資源,避免佔用記憶體。
第 3 行 創建一個SmtpClient類型的元件smtp ,可以用來發送信件。
new SmtpClient("smtp.office365.com", 587) 這是初始化的固定格式,告訴元件我們是要用office365寄信,port 使用 587。
*補充:
SmtpClient 是一個.net內建提供給你的類型,可以用來寄信。
new SmtpClient("smtp.office365.com", 587) , new MailMessage() 你看這兩個初始化的格式都長很像,這就是.net初始化基本上會長的形式 new '某個你要的類型'() ,在小括號裡面帶東西則是先設定好某些預設值。
程式碼片段:
smtp.EnableSsl = true;smtp.DeliveryMethod = SmtpDeliveryMethod.Network;smtp.UseDefaultCredentials = false;smtp.Credentials = new NetworkCredential("你的寄信帳號@xxx.com", "寄信帳號的密碼");
-------------------------------------------------------------------------------------------------------
第 1 - 3 行 設定我們前面建立的smtp元件寄信的規格,因此這三行也都是固定格式,除非你有特殊需求再去調整,不然就用固定格式即可。
第 4 行 smtp.Credentials設定你要用哪個帳號去寄信,並且要提供密碼。
new NetworkCredential("你的寄信帳號@xxx.com", "寄信帳號的密碼");把你自己的帳號密碼替換進去。
smtp.Credentials = new NetworkCredential("[email protected]", "123");這樣就成功設定好要寄信的帳號了。
程式碼片段:
mail.From = new MailAddress("你的寄信帳號@xxx.com");mail.To.Add("你的收件帳號@xxx.com");mail.Subject = "測試寄送附件";mail.Body = "這是從資料夾自動加入附件的測試郵件";
-------------------------------------------------------------------------------------------------------
第 1 行 前面建立的mail元件開始設定一下待會要寄出的內容,
mail.From = new MailAddress("[email protected]");設定mail是從哪個信箱寄出。
第 2 行 mail.To.Add("[email protected]");To就跟我們平常寄信的格式一樣,是設定收件人的意思。
如果想多個收件人其實非常簡單繼續往下增加就好。
mail.To.Add("[email protected]");
mail.To.Add("[email protected]");
mail.To.Add("[email protected]");
第 3 行 mail.Subject = "測試寄送附件";Subject就是設定信件的主旨。
第 4 行 mail.Body = "這是從資料夾自動加入附件的測試郵件";
Body就是設定信件的內容。
程式碼片段:
if (Directory.Exists(folderPath)){
-------------------------------------------------------------------------------------------------------
第 1 行 if (Directory.Exists(folderPath))判斷放檔案的資料夾存不存在,存在才會進去大括號裡面開始把檔案附加到信件的附件裡面。
程式碼片段:
string[] files = Directory.GetFiles(folderPath);foreach (string file in files){Attachment attachment = new Attachment(file);mail.Attachments.Add(attachment);}
-------------------------------------------------------------------------------------------------------
第 1 行 Directory.GetFiles(folderPath)這是.net的內建功能,Directory如字面的意思就是目錄,GetFiles取得檔案,所以就會從你的資料夾路徑folderPath取得檔案,取回來的是一個string型態的陣列裡面放了資料夾底下所有檔案的路徑,然後我們用一個string型態的陣列files去裝取回來的值。
第 2 行 foreach (string file in files),用迴圈去把一個個檔案名稱抓出來放到string型態的變數file。
第 4 行 Attachment是用來裝信件附件檔的型態,我們創建一個並且初始化new Attachment(file)把檔案位置file丟進去,這樣檔案就會裝到attachment裡面。
第 5 行 mail.Attachments.Add(attachment);前面我們創建的MailMessage型態的元件mail,裡面的Attachments我們用Add把剛剛我們裝起來的attachment放進去。
迴圈跑完全部放進去以後,到時候信件的附件就會有資料夾裡面的所有檔案了。
程式碼片段:
else{MessageBox.Show("資料夾不存在");return;}
-------------------------------------------------------------------------------------------------------
第 1 行 else放檔案的資料夾不存在,會進來這邊提示你資料夾不存在。
第 3 行 MessageBox.Show("資料夾不存在");彈跳視窗提示你資料夾不存在。
第 4 行 return是.net的內建用法,可以讓你返回原本你程式執行的地方,返回後return下面的程式碼就不會繼續執行了。
程式碼片段:
try{smtp.Send(mail);MessageBox.Show("寄信成功");}
-------------------------------------------------------------------------------------------------------
第 1 行 try是.net內建用法放,用try包起來的區域可以防止程式錯誤時整個掛掉。
第 3 行 smtp.Send(mail);我們前面把所有信件的內容都組出來了,現在只要用smtp裡面提供的Send功能然後把組好的mail放進去,Send就會幫我們把信發出去。
第 4 行 MessageBox.Show("寄信成功");彈跳視窗提示一下我們成功把信寄出。
程式碼片段:
catch (Exception ex){MessageBox.Show("寄信失敗:" + ex.Message);}
-------------------------------------------------------------------------------------------------------
第 1 行 catch (Exception ex)當try裡面如果有程式出問題,程式不會掛掉,會被catch抓起來,並且我們建一個Exception類型ex放異常訊息。
第 3 行 MessageBox.Show("寄信失敗:" + ex.Message);用彈跳視窗來顯示錯誤訊息,Exception就如字面是例外的意思,這個類別有提供一個Message會儲存例外的訊息,我們只要ex.Message就能看裡面的錯誤內容是什麼。
結論
目前我們完成了Office365的版本,不過,通常我們個人的電腦不會去買Office365,都是公司才會買這種軟體,因此我們下一章就來講gmail的版本,這樣子就算使用個人電腦也可以完成練習喔!


















