首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 郵件發送兩大路徑實戰:CDOSYS 元件透過 SMTP 驗證與本機 IIS 虛擬 SMTP 服務對比

     編輯:關於C語言

方案一:透過外部 SMTP 伺服器(如 126、Gmail、Outlook)

使用 `System.Web.Mail`(.NET Framework 1.x/2.0 相容)或現代 `System.Net.Mail.SmtpClient`。核心在於 **SMTP 驗證** 設定。

System.Web.Mail 經典寫法(舊專案維護)


using System.Web.Mail;

public void SendViaExternalSmtp() {
    MailMessage msg = new MailMessage();
    msg.From = "yourname@126.com";
    msg.To = "target@example.com";
    msg.Subject = "測試郵件";
    msg.BodyFormat = MailFormat.Text;
    msg.Body = "內容測試";

    // 關鍵:SMTP 驗證欄位
    msg.Fields.Add("https://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1"); // 1 = Basic
    msg.Fields.Add("https://schemas.microsoft.com/cdo/configuration/sendusername", "yourname");
    msg.Fields.Add("https://schemas.microsoft.com/cdo/configuration/sendpassword", "yourpassword");

    SmtpMail.SmtpServer = "smtp.126.com"; // 或 smtp.gmail.com:587
    SmtpMail.Send(msg);
}

現代 System.Net.Mail 寫法(.NET 2.0+ 推薦)


using System.Net.Mail;
using System.Net;

public void SendModern(string smtpHost, int port, string user, string pass, bool enableSsl) {
    using (var client = new SmtpClient(smtpHost, port)) {
        client.Credentials = new NetworkCredential(user, pass);
        client.EnableSsl = enableSsl; // Gmail/Outlook 必須 true
        client.DeliveryMethod = SmtpDeliveryMethod.Network;

        var msg = new MailMessage {
            From = new MailAddress(user, "顯示名稱"),
            Subject = "測試",
            Body = "

HTML 內容

", IsBodyHtml = true }; msg.To.Add("target@example.com"); client.Send(msg); // 或 client.SendMailAsync(msg) } }

方案二:本機 IIS 虛擬 SMTP 服務(零驗證、極速提交)

適用於:伺服器端批量發送、不想管理外部帳密、需高吞吐量。

IIS SMTP 設定步驟

  1. 安裝 IIS 角色服務 → **SMTP Server**
  2. IIS 管理器 → **虛擬 SMTP 伺服器** → 右鍵內容 → **存取** 分頁 → **轉送限制**
    • 選「只有下列清單」→ 新增 `127.0.0.1`(僅允許本機)
    • 或「除了下列清單」→ 留空(開放轉送,**極度危險**,會成垃圾郵件跳板)
  3. 啟動服務,確認防火牆開放 25 埠(對內)
  4. 郵件佇列目錄:`C:\inetpub\mailroot\`(Pickup/Queue/Badmail/Drop)

程式碼極簡


// System.Web.Mail
SmtpMail.SmtpServer = "localhost";
SmtpMail.Send(msg); // 瞬間回傳,實際投遞由 SMTP 服務背景處理

// System.Net.Mail
var client = new SmtpClient("localhost", 25) { DeliveryMethod = SmtpDeliveryMethod.Network };
client.Send(msg);

兩大路徑深度對比

維度外部 SMTP (驗證)本機 IIS SMTP
發送速度(回傳)較慢(需握手、驗證、排隊)極快(寫入 Pickup 目錄即返回)
真實投遞率高(信譽由提供商維護)低(需自建 SPF/DKIM/DMARC、IP 信譽、反向解析)
帳密管理需安全儲存無
附件/大郵件受提供商限制僅受磁碟/記憶體限制
適用場景一般應用、交易郵件、通知信內部系統、大量行銷信、日誌通知
風險帳號被鎖、每日額度限制IP 被列入黑名單、垃圾郵件投訴、開放轉送濫用

常見坑點與解決

  • 本機 SMTP 寄往 Gmail/Outlook 進垃圾箱/退信:必須為發送 IP 設定 **SPF TXT 記錄**、**DKIM 簽名**、**DMARC 政策**、**反向 DNS (PTR)**、確保非動態 IP、加入郵件商白名單(如 Microsoft SNDS、Google Postmaster Tools)。
  • SmtpMail.SmtpServer = "localhost" 但郵件卡在 Queue:檢查 `C:\inetpub\mailroot\Queue` `.eml` 檔,用記事本開啟查看錯誤碼;常見:DNS 解析失敗、遠端伺服器拒收、轉送被拒。
  • System.Web.Mail 已標記過時:新專案請直接使用 `System.Net.Mail` 或 MailKit。
  • 中文顯示名稱亂碼:`From = new MailAddress("email@domain.com", "顯示名稱", Encoding.UTF8)`

架構建議:混合模式


public interface IMailSender {
    Task SendAsync(MailMessage msg);
}

public class SmtpMailSender : IMailSender { /* 包裝 SmtpClient */ }
public class PickupMailSender : IMailSender { /* 寫入 Pickup 目錄 .eml */ }

// 依設定注入:交易信走 SMTP,大量通知走 Pickup + 背景服務輪詢發送
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved