2012-12-12 79 views
6

有沒有庫或無外部庫的方法?我使用的Apache作爲詹姆斯我的郵件服務器,目前發送電子郵件這樣的:如何使用DKIM簽署Javamail

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(); 
    }  
} 

但我想事先與DKIM簽名的電子郵件。我知道我需要實現DKIM簽名到詹姆斯服務器,並計劃使用jDKIM來做到這一點,我也明白,我需要使用諸如www.port25.com之類的東西來創建密鑰,但是如何在java之前實際簽名電子郵件我發送出去了?

回答

3

我結束了使用DKIM用來爲JavaMail可從以下網址下載: DKIM For Javamail

下面是一個例子(其在下載的例子非常有據可查):最近增加

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

與在郵件服務器上設置DKIM(如使用Postfix的openDKIM)相比,使用此功能有什麼優勢? –

+0

@Half_Duplex優點是您可以使用多個MTA,而無需爲每個MTA配置openDKIM – Horen

+0

此示例在Source Forge上使用非常舊版本的DKIM for Java。它已經被轉移到GitHub並且變得不活躍。後來它仍被分支到一個名爲[java-utils-mail-dkim](https://github.com/markenwerk/java-utils-mail-dkim)的仍然活動的項目。你可以在我的[其他答案](http://stackoverflow.com/a/37161192/441662)在這裏看到它的行動。 –

2

Simple Java Mail支持DKIM簽名。這是你的代碼,但現在簡單的Java郵件:

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); 
} 

私有密鑰參數可以是FileInputStreambyte[]

有趣的是,在幕後簡單的Java Mail使用java-utils-mail-dkim(GitHub上),這是對休眠DKIM-for-JavaMail(GitHub上)的有源叉,這是你現在所使用的圖書館,DKIM For Javamail(SourceForge上)的延續。所以,你使用的是非常古老的。