2012-12-12 8 views
6

Gibt es eine Bibliothek oder eine Möglichkeit, dies ohne eine externe Bibliothek zu tun? Ich verwende Apache James als meine Mail-Server und E-Mail zur Zeit wie folgt an:So signieren Sie Javamail mit DKIM

public void sendMessage(String to, String subject, String content) { 
    MimeMessage message = new MimeMessage(session); 
    try { 
     message.addRecipients(Message.RecipientType.TO, to); 
     message.setFrom(new InternetAddress(from)); 
     message.setSubject(subject); 
     message.setContent(content, "text/html; charset=utf-8"); 
     Transport.send(message); 
    } catch (MessagingException e) { 
     e.printStackTrace(); 
    }  
} 

aber ich möchte die E-Mail mit DKIM vor der Hand unterzeichnen. Ich verstehe, dass ich DKIM-Signierung in den James-Server implementieren muss und plane, jDKIM dafür zu verwenden. Ich verstehe auch, dass ich die Schlüssel mit etwas wie www.port25.com erstellen muss, aber wie unterzeichne ich die E-Mail tatsächlich in Java Ich schicke es aus?

Antwort

3

ich landete mit DKIM für Javamail, die unter folgenden Adresse heruntergeladen werden kann: DKIM For Javamail

Hier ist ein Beispiel (Es ist ziemlich gut in den Beispielen im Download dokumentiert):

public void sendMessage(String to, String subject, String content) { 
    //Create DKIM Signer 
    DKIMSigner dkimSigner = null; 
    try { 
     dkimSigner = new DKIMSigner(properties.getProperty("mail.smtp.dkim.signingdomain"), properties.getProperty("mail.smtp.dkim.selector"), properties.getProperty("mail.smtp.dkim.privatekey")); 
     dkimSigner.setIdentity(properties.getProperty("mail.user") + "@" + properties.getProperty("mail.smtp.dkim.signingdomain")); 
     dkimSigner.setHeaderCanonicalization(Canonicalization.SIMPLE); 
     dkimSigner.setBodyCanonicalization(Canonicalization.RELAXED); 
     dkimSigner.setLengthParam(true); 
     dkimSigner.setSigningAlgorithm(SigningAlgorithm.SHA1withRSA); 
     dkimSigner.setZParam(true); 
    } catch (Exception e) { 
    e.printStackTrace(); 
     } 
    if(dkimSigner != null) { 
     //Create message 
     Message message = new SMTPDKIMMessage(session, dkimSigner); 
     try { 
      message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false)); 
      message.setFrom(new InternetAddress(from)); 
      message.setSubject(subject); 
      message.setContent(content, "text/html; charset=utf-8"); 
      Transport.send(message); 
     } catch (MessagingException e) { 
      e.printStackTrace(); 
     } 
    }   
} 
+0

Welche Vorteile hat dies, wenn DKIM nicht auf dem Mailserver eingerichtet wird, z. B. openDKIM mit Postfix? –

+0

@Half_Duplex Der Vorteil ist, dass Sie mehrere MTAs verwenden können, ohne dafür openDKIM konfigurieren zu müssen. – Horen

+0

Dieses Beispiel verwendet eine sehr alte Version von DKIM für Java auf Source Forge. Es wurde seither nach GitHub verlegt und wurde inaktiv. Später wurde es noch zu einem noch aktiven Projekt namens [java-utils-mail-dkim] (https://github.com/markenwerk/java-utils-mail-dkim) gegabelt. Sie können es in Aktion in meiner [anderen Antwort] (http://stackoverflow.com/a/37161192/441662) hier sehen. –

2

Simple Java Mail kürzlich hinzugefügt Unterstützung für die DKIM-Unterzeichnung. Hier ist der Code, aber jetzt mit einfacher Java Mail:

public void sendMessage(String to, String subject, String content) { 
    final Email email = new Email.Builder() 
      .from(null, from) 
      .to(null, to) 
      .subject(subject) 
      .textHTML(content) 
      .build(); 

    email.signWithDomainKey(new File(properties.getProperty("mail.smtp.dkim.privatekey")), 
          properties.getProperty("mail.smtp.dkim.signingdomain"), 
          properties.getProperty("mail.smtp.dkim.selector")); 

    new Mailer(...).sendMail(email); 
} 

Das private Schlüssel Argument ein File sein kann, InputStream oder ein byte[].

Interessanterweise Hinter den Kulissen Einfache Java Mail verwendet java-utils-mail-dkim (GitHub), die auf der ruhenden DKIM-for-JavaMail (GitHub), die die Fortsetzung der Bibliothek Sie verwenden jetzt eine aktive Gabel ist, DKIM For Javamail (Sourceforge). Also, der, den du benutzt, ist sehr alt.