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

C# SMTP 郵件發送常見錯誤碼大全與解決方案

     編輯:關於C語言

引言

使用 System.Net.Mail.SmtpClient 發送郵件時,開發者經常遭遇「服務器要求安全連接或客戶端未通過身份驗證」「服務器不支持安全連接」「Authentication required」等異常。本文系統整理了四類典型 SMTP 錯誤及其解決思路,並附贈 Foxmail、Outlook 常見退信代碼對照表,幫助你快速定位並修復郵件發送故障。

核心代碼模板(修正版)

var mail = new MailMessage("sender@sina.com", "receiver@sina.com", "主題", "正文")
{
    BodyEncoding = Encoding.UTF8,
    IsBodyHtml = false
};

var client = new SmtpClient("smtp.sina.com", 587) // 關鍵:顯式指定端口
{
    Credentials = new NetworkCredential("sender@sina.com", "授權碼或密碼"),
    EnableSsl = true,              // 新浪/騰訊/網易等主流服務商均需 SSL
    UseDefaultCredentials = false, // 必須為 false,否則憑據不生效
    DeliveryMethod = SmtpDeliveryMethod.Network
};

client.Send(mail);

關鍵點:

  • 端口號:587(提交端口,需 SSL)或 465(隱式 SSL),25 端口多被封鎖或不加密。
  • EnableSsl:主流服務商(新浪、QQ、163、Gmail)均要求 true。
  • 授權碼:非登錄密碼,需在郵箱網頁端「設置 → 客戶端授權」開啟 POP3/SMTP/IMAP 服務並生成。
  • UseDefaultCredentials = false:必須置於 Credentials 賦值之前,否則系統憑據會覆蓋你設置的用戶名密碼。

四大典型錯誤與解決方案

錯誤一:5.7.1 Client was not authenticated

System.Net.Mail.SmtpException: SMTP 服務器要求安全連接或客戶端未通過身份驗證。
服務器響應為: 5.7.1 Client was not authenticated

原因:未指定端口(默認 25),或端口與 SSL 設置不匹配。
解決:顯式指定 new SmtpClient("smtp.sina.com", 587) 並設置 EnableSsl = true。163 郵箱尤為嚴格,建議統一使用 587+SSL。

錯誤二:服務器不支持安全連接

System.Net.Mail.SmtpException: 服務器不支持安全連接。

原因:服務器確實不支持 SSL(如某些企業內部郵件服務器),但代碼設置了 EnableSsl = true。
解決:
① 設置 EnableSsl = false 或移除該行;
② 或聯繫郵件服務商開啟 SSL/TLS 支持(推薦)。

錯誤三:Authentication required

SMTP 服務器要求安全連接或客戶端未通過身份驗證。
服務器響應為: Authentication required

原因:服務器要求 SSL 加密傳輸憑據,但客戶端未開啟 SSL。
解決:將 EnableSsl = false 改為 true。若隨後出現「錯誤二」,說明該服務器不支持 SSL,需聯繫服務商或改用其他郵件服務商。

錯誤四:5.7.0 Must issue a STARTTLS command first

SMTP 服務器要求安全連接或客戶端未通過身份驗證。
服務器響應為: 5.7.0 Must issue a STARTTLS command first

原因:服務器強制要求 STARTTLS 升級加密通道(新浪、Gmail 等常見)。
解決:確保 EnableSsl = true 且端口為 587(STARTTLS 標準端口)。

「萬能檢查清單」—— 發送前逐項核對

  1. POP3/SMTP 服務器地址正確(如 smtp.qq.com、smtp.163.com、smtp.sina.com)
  2. 端口正確:587(SSL/STARTTLS)或 465(隱式 SSL)
  3. 「我的服務器要求身份驗證」已勾選
  4. 用戶名(全郵箱地址)與授權碼正確,非登錄密碼
  5. UseDefaultCredentials = false 在 Credentials 賦值前設置

常見退信代碼速查表(節選)

代碼含義典型原因與對策
550 relaying mail to <> is not allowed拒絕轉發SMTP 服務器限制收件域,需更換服務商或使用自身域名發信
550 <>: local user only僅限本地用戶163/126/yeah.net 僅允許自身賬號發信,需在發件人地址填寫該賬號
553 sorry, that domain isn't in my list of allowed rcpthosts域名不在允許列表sina/21cn/china.com 等要求發件人域名在白名單,需使用該服務商郵箱發信
535 Error: authentication failed認證失敗授權碼錯誤或未開啟客戶端授權,重新生成授權碼並檢查大小寫
550 Unable to relay for ...中繼被拒常見於 Wingate 代理,檢查代理設置與發件人格式
554 Transaction failed事務失敗網絡抖動或服務器負載高,稍後重試

Outlook / Foxmail 客戶端常見錯誤碼(十六進制)

  • 0x800CCC0D:找不到主機 —— 檢查 SMTP 地址拼寫、DNS 解析
  • 0x800CCC0E:連接服務器失敗 —— 服務器維護、防火牆攔截、端口被封
  • 0x800CCC0F:服務器斷開連接 —— 增加超時時間、換更穩定網絡
  • 0x800CCC18:登錄失敗 —— 加密登錄設置與服務器不匹配
  • 0x800CCC78:發件人地址無效 —— 檢查 From 地址格式
  • 0x800CCC79:收件人被拒絕(Relay Denied) —— 必須使用 ISP 提供的 SMTP 服務器
  • 0x800CCC92:賬號/密碼錯誤 —— 確認授權碼而非登錄密碼

退信郵件結構解讀技巧

退信郵件前半部分為固定模板,真實原因藏在後半部分「服務器返回信息」中。常見關鍵詞:

  • unknown user:收件地址拼寫錯誤或賬號不存在
  • host not found:收件域名 DNS 解析失敗
  • loops back to myself:域名未激活或 MX 記錄指回自身
  • spam/blocked:發件 IP 被反垃圾組織列入黑名單,需申請解封
  • quota exceeded:收件箱容量已滿

總結

SMTP 發送故障 90% 歸因於「端口/SSL/授權碼」三要素不匹配。掌握 587+SSL+授權碼 標準組合、養成發送前核對清單習慣、熟悉常見退信代碼含義,即可覆蓋絕大多數場景。遇到疑難雜癥時,優先啟用 SmtpClient 的日誌記錄(System.Diagnostics 配置 System.Net trace),捕獲完整 SMTP 會話報文,將是定位問題的終極武器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved