2017-06-03 2 views
10

Basierend auf dieser question habe ich mich entschieden, E-Mails von ASP.NET.MVC senden, um Spam-Score von E-Mails zu verringern, aber ich habe irgendwo einen Fehler.E-Mail-Signatur in C#

Code:

public void SendEmail(MailMessage mailMessage) 
    { 
     string domain = "kup-nemovitost.cz"; 

     var message = MimeMessage.CreateFromMailMessage(mailMessage); 

     HeaderId[] headers = new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date }; 
     DkimCanonicalizationAlgorithm headerAlgorithm = DkimCanonicalizationAlgorithm.Relaxed; 
     DkimCanonicalizationAlgorithm bodyAlgorithm = DkimCanonicalizationAlgorithm.Relaxed; 

     string dkimPath = Path.Combine(ConfigHelper.GetDataPath(), "DKIM"); 
     string privateKey = Path.Combine(dkimPath, "kup-nemovitost.cz.private.rsa"); 

     DkimSigner signer = new DkimSigner(privateKey, domain, "mail") 
     { 
      SignatureAlgorithm = DkimSignatureAlgorithm.RsaSha1, 
      AgentOrUserIdentifier = "@" + domain, 
      QueryMethod = "dns/txt", 
     };   

     message.Prepare(EncodingConstraint.SevenBit); 
     message.Sign(signer, headers, headerAlgorithm, bodyAlgorithm); 

     using (var client = new MailKit.Net.Smtp.SmtpClient()) 
     { 
      client.Connect("localhost", 25, false); 
      client.Send(message); 
      client.Disconnect(true); 
     }   
    } 

ich das Ergebnis überprüfen auf http://www.isnotspam.com wird die Ausgabe folgende:

DKIM check details: 
---------------------------------------------------------- 

Result: invalid 
ID(s) verified: [email protected] 
Selector=mail 
domain=kup-nemovitost.cz 
DomainKeys DNS Record=mail._domainkey.kup-nemovitost.cz 

Mein DNS-Eintrag ist:

@ IN TXT "v=dkim1; s=mail; p=migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqdnov2pxnjmghdpxw5wpypk1rf7 kxs+5ouvh6f0hraryncku6wbvq+xovbgxz1kuddcb/s9o8wquftxrlffniik3wbm qc+upm+ndloxcxwy0bb2iktbgnmndjiexm/z0npaviwzebr2k6vqdzbp+lmcuece bwasqgw2fki5ospb4qidaqab" 

UPDATE:

Ich behebe einige Probleme in DNS-Eintrag und ich habe bessere Online-Checker gefunden dkimcore.org

Ich noch Validierungsfrage meines öffentlichen Schlüssels. Ich generierte 1024 RSA mit PuttyGen (ppk) und konvertiert es in RSA-Format. Die Originaldatei von PuTTYgen ist:

---- BEGIN SSH2 PUBLIC KEY ---- 
Comment: "rsa-key-20170606" 
AAAAB3NzaC1yc2EAAAABJQAAAIEAiyEwx+Idlf/Qp2fTYrQMwV3MuF9W7yaKDMHk 
hzoH+MqWKtNDngQoJcmbyrkMeF0VLYo246ma3gPZh9cDL7i8ygOYKagbyUjgtZFz 
y+et0tY/+G/IZNaHiQp0QuG/J71uZrl4Jlgkq+0s5bZxpRR45aRpcG1HQMIm6Ku7 
lgmOt88= 
---- END SSH2 PUBLIC KEY ---- 

Also habe ich den Inhalt einfach kopieren (mit Ausnahme der kommentierten Zeilen) auf DNS-Eintrag und ich habe folgende Ausgabe von checker:

p= AAAAB3NzaC1yc2EAAAABJQAAAIEAiyEwx+Idlf/Qp2fTYrQMwV3MuF9W7yaKDMHkhzoH+MqWKtNDngQoJcmbyrkMeF0VLYo246ma3gPZh9cDL7i8ygOYKagbyUjgtZFzy+et0tY/+G/IZNaHiQp0QuG/J71uZrl4Jlgkq+0s5bZxpRR45aRpcG1HQMIm6Ku7lgmOt88= 
This doesn't seem to be a valid RSA public key: RSA.xs:178: OpenSSL error: wrong tag at blib/lib/Crypt/OpenSSL/RSA.pm (autosplit into blib/lib/auto/Crypt/OpenSSL/RSA/new_public_key.al) line 91. 
+1

Ok, also hast du irgendwo einen Fehler. Was ist das gewünschte Verhalten im Vergleich zu dem, was tatsächlich passiert? – Nkosi

+0

Das gewünschte Verhalten ist, dass http://www.isnotspam.com bestätigen soll, dass die E-Mail mit DKIM mit Ergebnis bestanden hat. – qub1n

+1

Dienste wie SendGrid haben eine ziemlich großzügige, kostenlose Tier-Ebene, die den Großteil der Last trägt, Ihre E-Mail nicht in Spam-Boxen landen zu lassen. –

Antwort

3

Wie wir in den Kommentaren heraus - Ihr Code ist in Ordnung, aber Sie haben Probleme mit dem öffentlichen Schlüssel. Erstens, es hat Leerzeichen in dns txt Datensatz, die es nicht haben kann. Dann haben Sie ein falsches Format für einen öffentlichen Schlüssel (SSH2). Tools, die Unterschrift erwarten anderes Format (regular PEM RSA) überprüfen, die wie folgt aussehen:

--- BEGIN RSA PUBLIC KEY --- 
MII .... 
--- END RSA PUBLIC KEY --- 

also die gleiche wie Ihre privaten Schlüssel. Sie können mit

ssh-keygen -f output.pub -m 'PEM' -e > public.pem 

SSH2 Schlüssel zur PEM umwandeln Wo output.pub öffentlichen Schlüssel in SSH2-Format ist. Mit einem solchen Schlüssel (und ohne Leerzeichen im DNS-Record) sollte es gut funktionieren, vorausgesetzt, Sie setzen das in den richtigen DNS-Record - key_selector._domainkey.your.domain.