C#發送DKIM簽名的郵件

來源:互聯網
上載者:User

DKIM(DomainKeys Identified Mail) 是一個電子郵件驗證標準——網域名稱金鑰指定郵件標準,郵件系統可據此標準判斷郵件是否為垃圾郵件。

它的工作原理是產生私密金鑰(private key)/公開金鑰(public key)對,將公開金鑰以TXT記錄的形式存放在 DNS 伺服器中,發送郵件時選擇相應的郵件欄位(比如From, To, Subject)通過私密金鑰產生簽名資訊並附加到郵件標頭之後進行發送。目標郵件伺服器收到郵件後,根據寄件者的網域名稱從 DNS 查詢中得到公開金鑰,然後用該公開金鑰驗證郵件標頭中的簽名資訊是否合法。

我們通過 C# 代碼成功發送了 DKIM 簽名的郵件,具體操作步驟如下:

1、通過 dkimcore.org 提供的工具產生私密金鑰以及需要添加至 DNS 中的包含公開金鑰的記錄

a)開啟 http://dkimcore.org/tools/,在 Domain Name 中輸入發送郵箱的網域名稱,點擊 Generate;

b)假設網域名稱是 cnblogs.biz,我們會得到如所示的三個資料——Selector(1362200600.cnblogs), Private key, DNS記錄(名稱為1362200600.cnblogs._domainkey,值是以v=DKIM1;開頭以冒號結尾的部分[不包含冒號,圖中未顯示])。

2、在DNS伺服器中添加TXT記錄

3、檢查DNS記錄是否添加成功

開啟 http://dkimcore.org/tools/ ,在 Check a published DKIM Core Key 欄目中輸入 Selector 與 Domain,點擊 check;如果添加成功,會顯示“This is a valid DKIM key record”。見:

4、寫 C# 代碼發送 DKIM 簽名的郵件

a) 從 github 簽出 DKIM.Net (https://github.com/dmcgiv/DKIM.Net) 的原始碼並編譯得到 DKIM.Net.dll;

b) 在項目中添加 DKIM.Net.dll 的引用,然後編寫 C# 發送郵件的代碼,範例程式碼如下:

static void SendDkimMail(){    var privateKey = @"-----BEGIN RSA PRIVATE KEY-----MIICXAIBAAKBgQDg7KQwmXRzrw+zsn5USz4GGee8vspz6CyA+y5J0yIS9Up2WJP3ySaxmIrUBpcLs7/u4rfDfUygAFBsGaU1A9pBxDF5Kfp/V/aWdSN6PClkqcS8jjxEqj4AbL1Ax74nZniWCLr3ttXezrUUjuNk2YR7gmedKmxKUqRuqKmrnYpCTQIDAQABAoGBAMID/iEZzXSYVjAIUKY/fRHgOJ/750CRzgm4IRZ3M9Yslf19rK05atIYpe/8e0AR3gaetCrBo14Ex1pnyLTxTMp98IZmk+lVPNU2bGhc/QQ7YpgMUga3b+MP7C3w/N7k8L2dUv0hjjLWKknWimNFfE8mWsYrAlC4I5YtP6Q2qjPhAkEA9WAN5ESsPHXlFWrPEISor2D3qX55XiOlZnkf1drnwVS72vK8yCP28yBtCuthK9OT4q5QSHwFWh47UEp3nsozKQJBAOqp5JFB8zfgoaLhbQ5R3voZxrNmDMpsI0eWpua+cjTd67sgjBk77Fbb8kN1nzXCq/QbqB+gwmq8YMMdHLxD/oUCQHG55lZhOc7/+YBWs8f9JE28zKzjMI9gSB3Zj9bHkdi6VCMjlDnS6XdAFSoVdEEi3A0ZK56c1MIy9ty81vpizxkCQED9CCYKY7dn6JvZXoCGv//3v4XTj1tIE4Ux/csNl0d45l4Op34dkFiF1VRFcPBMl56lQixwMyeoQAwJNfoVwpkCQCxr2Jp+NlQIXFPRP8Hotq9JkkqDQYCvpWLsQVLvV8NJvcubkzQjVRqo3N6nob826y3eysX5Ag8ThnvfBbPaA6o=-----END RSA PRIVATE KEY-----";    var domain = "cnblogs.biz";    var selector = "1362200600.cnblogs";    var headers = new string[] { "From", "To", "Subject" };    var mailMsg = new MailMessage();                mailMsg.To.Add(new MailAddress("收件者郵箱"));    mailMsg.From = new MailAddress("test@cnblogs.biz", "test");    mailMsg.Subject = "test";    mailMsg.Body = "test";               //對郵件進行DKIM簽名    var domainKeySigner = new DomainKeySigner(PrivateKeySigner.Create(privateKey),         domain, selector, headers);    mailMsg.DomainKeySign(domainKeySigner);    var smtpClient = new SmtpClient("mail.cnblogs.biz");    smtpClient.Send(mailMsg);}

c) 運行代碼發出郵件

5、內送郵件並檢查郵件是否通過 DKIM 驗證。

我們測試時郵件發向的是 gmail 郵箱,在 gmail 中該郵件的閱讀視窗選擇“顯示原始郵件”,如果通過了 DKIM 驗證,會看到如下的資訊:

DomainKey-Signature: a=rsa-sha1; c=simple; d=cnblogs.biz; h=From:To:Subject; q=dns; s=1362200600.cnblogs; b=JCzfhjomQPJK6m5GCLt/I/K4oQ7...;

註:如果您想用友好的 Selector 名稱(文中是1362200600.cnblogs),可以隨意設定,只要代碼中與 DNS 記錄中保持一致即可。比如用 dkim 名稱,在 DNS 添加記錄時名稱就是 dkim._domainkey ,代碼則為 var selector = "dkim";

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.