搜尋此網誌

2026/03/02

使用 VBA 與 CDO 在 Excel 中自動寄送郵件

在日常辦公自動化或資料報表流程中,很多人希望能夠由 Excel 自動寄送電子郵件,而不是手動開啟 Outlook 逐封寄信。利用 VBA(Visual Basic for Applications) 搭配 CDO(Collaboration Data Objects) 物件庫,你可以直接從 Excel 傳送郵件,而不需要依賴 Outlook 介面或其它第三方程式。

為什麼使用 CDO?

CDO 是 Windows 提供的一組 COM 物件,它讓開發者可以在程式中建立與操作電子郵件,例如:

  • 建立郵件內容

  • 設定 SMTP 伺服器

  • 指定寄件者與收件者

  • 支援 SMTP 驗證與 SSL 設定

透過 VBA 呼叫 CDO,你可以直接透過 SMTP 伺服器寄出郵件,而不需要開啟 Outlook 應用程式本身。


VBA 自動寄送郵件範例

以下程式碼示範如何在 Excel 中利用 CDO 物件自動寄送包含工作表內容的郵件。

📌 請先在 VBA 編輯器的工具選單中設定引用項目:
  勾選 ☑ Microsoft CDO for Windows 2000 Library


VBA 程式碼範例

Option Explicit

'宣告變數及參數
Dim objCDO As CDO.Message
Public theRng As Range
Const myUserId = "yourID" '請修改成你的帳號
Const myPassword = "yourPSW" '請修改成你的帳號密碼
Const mySMTPServer = "smtp.gmail.com" '請修改成你的寄送郵件伺服器
Const mySMTPport = 465 '須修改成你的送件伺服器使用的PORT, Gmail使用的是465

'寄信程式
Sub SendingEMail()
  Application.StatusBar = "Sending..." '狀態訊息顯示
  Set objCDO = New CDO.Message '創建新的物件

  '設置郵件伺服器參數
  '這是用Gmail測試成功的參數, 請參閱 Email Server 的設置說明
  With objCDO
    With .Configuration.Fields
      .Item(cdoSendUsingMethod) = cdoSendUsingPort
      .Item(cdoSendUserName) = myUserId
      .Item(cdoSendPassword) = myPassword
      .Item(cdoSMTPServer) = mySMTPServer
      .Item(cdoSMTPAuthenticate) = True
      .Item(cdoSMTPServerPort) = mySMTPport
      .Item(cdoSMTPUseSSL) = True
      .Update
    End With
  End With

  '填寫郵件各欄位資訊並寄送
  With objCDO
    .From = """報表傳送系統""<" & myUserId & "@" & VBA.Mid(mySMTPServer, 6) & ">" '寄件者信箱
    .To = ActiveSheet.Range("a1").Text 'Excel 工作表中的收件者信箱
    .Subject = "Excel 報表測試" '郵件主旨
    .TextBody = "測試內容" '郵件內容
    '設定重要性
    '.Fields("urn:schemas:mailheader:importance") = 2
    '.Fields("urn:schemas:httpmail:importance") = 2
    .Fields(cdoImportance) = cdoHigh
    .Fields.Update
    .Send
  End With

  Set objCDO = Nothing '釋放物件
  Application.StatusBar = False '恢復狀態訊息
End Sub



教學重點說明

📌 1. 設定 SMTP 伺服器

程式中使用的是 Gmail SMTP 設定:

  • SMTP 伺服器:smtp.gmail.com

  • Port:465

  • 需啟用 SSL

若使用不同的郵件服務,請依照該服務提供者的 SMTP 設定調整參數。


📌 2. 郵件內容與格式

此範例使用 TextBody 屬性寄送純文字格式的郵件內容,而非 HTML 格式。

若未來需要寄送格式較豐富的內容(例如表格、顏色或排版),則可以改用 HTMLBody 屬性,並撰寫 HTML 標籤內容。


📌 3. 不透過 Outlook 寄送

利用 CDO 寄送郵件不需要開啟 Outlook 或把 Outlook 設為預設郵件程式,這對於伺服器環境或無 Outlook 安裝的機器特別有用。


注意事項與相容性

🔔 版本注意:
使用 CDO 物件庫需要安裝對應的系統元件,而且在最新版的 Outlook 或 Office 環境中,CDO 支援程度已降低,不一定支援最新 Outlook 版本。


總結

透過 CDO 物件在 VBA 中寄送郵件,是一種簡單、靈活的方式,可直接在 Excel 中實現自動寄信的需求。只要正確設定 SMTP 參數、引用 CDO Library,就能輕鬆整合郵件寄送到工作流程中。這對報表自動化、提醒系統與批次通知等應用場景非常有用。


參考資料

本文在撰寫過程中,參考了 Ron de Bruin(Microsoft Excel MVP 專家)所整理的相關技術文章與範例程式。Ron de Bruin 長期專注於 Excel VBA 自動化、郵件整合與 Office 應用開發領域,其網站提供許多實務範例與說明,對於理解 VBA 寄信機制與 CDO 設定細節有極大幫助。可惜 Ron de Bruin 於 2023 年 10 月移除了所有關於 Windows 版 Excel 的內容,也在 2024 年正式退出擔任了 21 年的 Microsoft Excel MVP 專家。

另外,Microsoft 的技術文章 Working with Excel Workbooks and Worksheets in E-Mail 也有很多範例,建議有進階需求的讀者,可進一步前往參考。

沒有留言:

張貼留言