2012-12-12 17 views
6

Esiste una libreria o un modo per farlo senza una libreria esterna? Sto usando james Apache come server della posta e attualmente inviare email come questo:Come firmare Javamail con 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(); 
    }  
} 

Ma mi piacerebbe firmare l'email con DKIM prima mano. Capisco che devo implementare la firma DKIM nel server james e pianificare l'uso di jDKIM per fare questo, capisco anche che ho bisogno di creare le chiavi usando qualcosa come www.port25.com, ma come posso effettivamente firmare l'e-mail in java prima Lo mando?

risposta

3

ho finito per usare DKIM per JavaMail che può essere scaricato all'indirizzo: DKIM For Javamail

Ecco un esempio (La sua piuttosto ben documentato negli esempi nel download):

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

Quali sono i vantaggi dell'utilizzo di questo a differenza dell'impostazione di DKIM sul server di posta, come openDKIM con Postfix? –

+0

@Half_Duplex Il vantaggio è che è possibile utilizzare più MTA senza dover configurare openDKIM per ognuno di essi – Horen

+0

Questo esempio utilizza una versione molto vecchia di DKIM per Java su Source Forge. Da allora è stato spostato su GitHub e diventato inattivo. In seguito fu biforcato a un progetto ancora attivo chiamato [java-utils-mail-dkim] (https://github.com/markenwerk/java-utils-mail-dkim). Puoi vederlo in azione nella mia [altra risposta] (http://stackoverflow.com/a/37161192/441662) qui. –

2

Simple Java Mail aggiunte di recente supporto per la firma DKIM. Ecco il tuo codice, ma ora con i 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'argomento chiave privata può essere un File, InputStream o un byte[].

È interessante notare che, dietro le quinte Simple Mail utilizza Java java-utils-mail-dkim (GitHub), che è un fork attiva sul dormiente DKIM-for-JavaMail (GitHub), che era la continuazione della biblioteca si sta utilizzando ora, DKIM For Javamail (SourceForge). Quindi, quello che stai usando è molto vecchio.