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

C# 發送 DKIM 簽名郵件完整實作指南

     編輯:關於C#

DKIM 簡介

DKIM (DomainKeys Identified Mail) 是電子郵件認證標準,透過非對稱加密簽名驗證郵件來源真實性與完整性,幫助收件方判斷垃圾郵件。核心流程:

  1. 發件域名產生私鑰/公鑰對,公鑰以 TXT 記錄發布於 DNS
  2. 發送郵件時,以私鑰對指定 Header(From、To、Subject 等)簽名,附加於郵件頭 DKIM-Signature
  3. 收件伺服器查詢 DNS 取得公鑰,驗證簽名合法性

實作步驟

1. 產生金鑰對與 DNS 記錄

使用 dkimcore.org 工具:

  • 輸入域名(如 cnblogs.biz)點擊 Generate
  • 獲得三項資料:Selector(如 1362200600.cnblogs)、Private Key、DNS TXT 記錄值(v=DKIM1; k=rsa; p=...)

2. 設定 DNS TXT 記錄

  • 記錄名稱:{Selector}._domainkey(例:1362200600.cnblogs._domainkey)
  • 記錄值:工具產生的公鑰字串
  • 類型:TXT

3. 驗證 DNS 記錄生效

在 dkimcore.org "Check a published DKIM Core Key" 輸入 Selector 與 Domain,顯示 "This is a valid DKIM key record" 即成功。

4. C# 程式碼發送 DKIM 郵件

引用 DKIM.Net(GitHub 編譯得 DKIM.Net.dll)。

using System.Net.Mail;
using DKIM;

static void SendDkimMail()
{
    // 私鑰(含 BEGIN/END 標記)
    var privateKey = @"-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDg7KQwmXRzrw+zsn5USz4GGee8vspz6CyA+y5J0yIS9Up2WJP3
ySaxmIrUBpcLs7/u4rfDfUygAFBsGaU1A9pBxDF5Kfp/V/aWdSN6PClkqcS8jjxE
qj4AbL1Ax74nZniWCLr3ttXezrUUjuNk2YR7gmedKmxKUqRuqKmrnYpCTQIDAQAB
AoGBAMID/iEZzXSYVjAIUKY/fRHgOJ/750CRzgm4IRZ3M9Yslf19rK05atIYpe/8
e0AR3gaetCrBo14Ex1pnyLTxTMp98IZmk+lVPNU2bGhc/QQ7YpgMUga3b+MP7C3w
/N7k8L2dUv0hjjLWKknWimNFfE8mWsYrAlC4I5YtP6Q2qjPhAkEA9WAN5ESsPHXl
FWrPEISor2D3qX55XiOlZnkf1drnwVS72vK8yCP28yBtCuthK9OT4q5QSHwFWh47
UEp3nsozKQJBAOqp5JFB8zfgoaLhbQ5R3voZxrNmDMpsI0eWpua+cjTd67sgjBk7
7Fbb8kN1nzXCq/QbqB+gwmq8YMMdHLxD/oUCQHG55lZhOc7/+YBWs8f9JE28zKzj
MI9gSB3Zj9bHkdi6VCMjlDnS6XdAFSoVdEEi3A0ZK56c1MIy9ty81vpizxkCQED9
CCYKY7dn6JvZXoCGv//3v4XTj1tIE4Ux/csNl0d45l4Op34dkFiF1VRFcPBMl56l
QixwMyeoQAwJNfoVwpkCQCxr2Jp+NlQIXFPRP8Hotq9JkkqDQYCvpWLsQVLvV8NJ
vcubkzQjVRqo3N6nob826y3eysX5Ag8ThnvfBbPaA6o=
-----END RSA PRIVATE KEY-----";

    var domain = "cnblogs.biz";
    var selector = "1362200600.cnblogs"; // 需與 DNS 記錄一致
    var headers = new[] { "From", "To", "Subject" }; // 參與簽名的 Header

    var mailMsg = new MailMessage();
    mailMsg.To.Add(new MailAddress("收件人@example.com"));
    mailMsg.From = new MailAddress("test@cnblogs.biz", "Test Sender");
    mailMsg.Subject = "DKIM 測試郵件";
    mailMsg.Body = "這是一封帶有 DKIM 簽名的測試郵件。";

    // 執行 DKIM 簽名
    var signer = new DomainKeySigner(
        PrivateKeySigner.Create(privateKey), 
        domain, selector, headers);
    mailMsg.DomainKeySign(signer);

    // 發送
    using (var smtp = new SmtpClient("mail.cnblogs.biz"))
    {
        smtp.Send(mailMsg);
    }
}

5. 驗證收件端 DKIM 狀態

Gmail 收件後選擇「顯示原始郵件」,搜尋 DKIM-Signature 與 Authentication-Results:

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cnblogs.biz;
    s=1362200600.cnblogs; h=From:To:Subject; bh=...; b=...

Authentication-Results: mx.google.com;
    dkim=pass header.i=@cnblogs.biz header.s=1362200600.cnblogs header.b=...;
    spf=pass ...; dmarc=pass ...

出現 dkim=pass 即代表驗證通過。

常見坑點與提示

  • 私鑰格式:需為 PKCS#1 PEM 格式(含 -----BEGIN RSA PRIVATE KEY-----),PKCS#8 需轉換
  • Selector 命名:可自訂(如 dkim),只要 DNS 與程式碼一致即可
  • Canonicalization:預設 relaxed/relaxed,兼容性最佳
  • Header 選擇:至少包含 From,建議加 To、Subject、Date、Message-ID
  • 測試工具:mail-tester.com、dkimvalidator.com

正確部署 DKIM 能大幅提升郵件送達率與域名信譽,是企業級郵件系統必備配置。

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