首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> C# 入門

C# SmtpClient 發送郵件完整指南:SSL、附件、編碼、優先級一次搞定

     編輯:C# 入門

System.Net.Mail.SmtpClient 是 .NET 發送郵件的標準工具。本文提供支援 SSL、附件、HTML/純文字、編碼指定、優先級設定的完整通用方法,並列出常用郵件服務商 SMTP 設定。

常用 SMTP 伺服器速查

服務商SMTP 位址埠號 (SSL)備註
Gmailsmtp.gmail.com587 (STARTTLS) / 465 (SSL)需開啟「低安全性應用程式」或應用程式密碼
Outlook/Hotmailsmtp.office365.com587同 Gmail
163/126smtp.163.com / smtp.126.com465 / 994需開啟 SMTP 服務並設定授權碼
QQsmtp.qq.com465 / 587需開啟 SMTP 並獲取授權碼
Yahoosmtp.mail.yahoo.com465 / 587需開啟「不安全應用程式」存取

通用發送方法 (支援 .NET Framework / .NET Core / .NET 5+)


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

public static class MailHelper
{
    public static void SendEmail(
        string fromEmail, string fromPassword,
        string toEmail, string smtpHost, int smtpPort,
        string subject, string body,
        bool enableSsl = true,
        bool isBodyHtml = false,
        string[] attachments = null,
        Encoding bodyEncoding = null,
        MailPriority priority = MailPriority.Normal)
    {
        // 發件人/收件人
        var from = new MailAddress(fromEmail);
        var to = new MailAddress(toEmail);
        using var message = new MailMessage(from, to);

        // 主旨、內容、編碼
        message.Subject = subject;
        message.Body = body;
        message.IsBodyHtml = isBodyHtml;
        message.BodyEncoding = bodyEncoding ?? Encoding.UTF8;
        message.SubjectEncoding = message.BodyEncoding;
        message.Priority = priority;

        // 附件
        if (attachments != null)
        {
            foreach (string file in attachments)
            {
                if (File.Exists(file))
                    message.Attachments.Add(new Attachment(file));
            }
        }

        // SMTP 客戶端
        using var client = new SmtpClient(smtpHost, smtpPort)
        {
            EnableSsl = enableSsl,
            UseDefaultCredentials = false,
            Credentials = new NetworkCredential(
                fromEmail.Contains('@') ? fromEmail.Substring(0, fromEmail.IndexOf('@')) : fromEmail,
                fromPassword),
            DeliveryMethod = SmtpDeliveryMethod.Network,
            Timeout = 30000 // 30 秒
        };

        try
        {
            client.Send(message);
            Console.WriteLine("郵件發送成功");
        }
        catch (SmtpException ex)
        {
            Console.WriteLine($"SMTP 錯誤: {ex.StatusCode} - {ex.Message}");
            throw;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"發送失敗: {ex.Message}");
            throw;
        }
    }
}

呼叫範例


// 163 郵箱發送 HTML 郵件含附件
MailHelper.SendEmail(
    fromEmail: "your@163.com",
    fromPassword: "你的授權碼", // 非登入密碼
    toEmail: "target@example.com",
    smtpHost: "smtp.163.com",
    smtpPort: 465,
    subject: "測試郵件",
    body: "

你好

這是 HTML 郵件

", enableSsl: true, isBodyHtml: true, attachments: new[] { @"C:\report.pdf", @"C:\image.png" }, priority: MailPriority.High );

進階主題

  • 大量發送:單一連線複用 SmtpClient,避免頻繁建立 TCP 連線;考慮使用郵件佇列 (如 Hangfire) 非同步發送。
  • DKIM/SPF/DMARC:自架郵件伺服器需正確設定 DNS 記錄,否則易進垃圾信箱。
  • .NET Core 3.1+ 注意:SmtpClient 已標記過時 (Obsolete),官方建議改用 MailKit (MimeKit) 套件,功能更強且跨平台。
  • 非同步發送:client.SendMailAsync(message) 避免阻塞 UI 執行緒。

MailKit 現代化範例 (建議新專案採用)


// NuGet: MailKit
using MailKit.Net.Smtp;
using MimeKit;

var message = new MimeMessage();
message.From.Add(new MailboxAddress("發件人", "your@163.com"));
message.To.Add(new MailboxAddress("收件人", "target@example.com"));
message.Subject = "測試";
message.Body = new TextPart("html") { Text = "

你好

" }; using var client = new SmtpClient(); await client.ConnectAsync("smtp.163.com", 465, true); // SSL await client.AuthenticateAsync("your@163.com", "授權碼"); await client.SendAsync(message); await client.DisconnectAsync(true);

掌握 SmtpClient 基礎用法並了解 MailKit 現代替代方案,讓 C# 發送郵件功能穩健、可維護、跨平台。

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