2012-12-12 2 views
6

Existe-t-il une bibliothèque ou un moyen de le faire sans bibliothèque externe? J'utilise James apache comme mon serveur de messagerie et envoie actuellement email comme ceci:Comment signer Javamail avec 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(); 
    }  
} 

Mais je voudrais signer l'e-mail avec DKIM avant la main. Je comprends que je dois implémenter la signature DKIM dans le serveur james et planifier l'utilisation de jDKIM pour cela, je comprends aussi que je dois créer les clés en utilisant quelque chose comme www.port25.com, mais comment signer l'email en java avant Je l'envoie?

Répondre

3

Je fini par utiliser DKIM pour Javamail qui peut être téléchargé à l'adresse: DKIM For Javamail

Voici un exemple (Son assez bien documenté dans les exemples dans le téléchargement):

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

Quels sont les avantages d'utiliser ceci plutôt que de configurer DKIM sur le serveur de messagerie, comme openDKIM avec Postfix? –

+0

@Half_Duplex L'avantage est que vous pouvez utiliser plusieurs MTA sans avoir à configurer openDKIM pour chacun d'eux – Horen

+0

Cet exemple utilise une très ancienne version de DKIM pour Java sur Source Forge. Il a depuis été déplacé à GitHub et est devenu inactif. Plus tard, il a été ajouté à un projet encore actif appelé [java-utils-mail-dkim] (https://github.com/markenwerk/java-utils-mail-dkim). Vous pouvez le voir en action dans mon [autre réponse] (http://stackoverflow.com/a/37161192/441662) ici. –

2

Simple Java Mail récemment ajoutés support pour la signature DKIM. Voici votre code, mais maintenant avec Simple 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); 
} 

L'argument clé privée peut être un File, InputStream ou byte[].

Fait intéressant, les coulisses Simple Mail utilise Java java-utils-mail-dkim (GitHub), qui est une fourche active sur le DKIM-for-JavaMail dormant (GitHub), qui était la continuation de la bibliothèque que vous utilisez actuellement, DKIM For Javamail (SourceForge). Donc, celui que vous utilisez est très vieux.