2012-12-12 30 views
6

Có thư viện hay cách nào để thực hiện việc này mà không có thư viện bên ngoài không? Tôi đang sử dụng apache james làm máy chủ thư của tôi và hiện đang gửi email như thế này:Cách đăng ký Javamail với 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(); 
    }  
} 

Nhưng tôi muốn ký email bằng DKIM trước khi quay tay. Tôi hiểu rằng tôi cần phải thực hiện việc ký DKIM vào máy chủ james và lập kế hoạch sử dụng jDKIM để làm điều này, tôi cũng hiểu rằng tôi cần tạo khóa bằng cách sử dụng một cái gì đó như www.port25.com, nhưng làm cách nào để thực sự ký email trong java trước Tôi gửi nó ra?

Trả lời

3

tôi đã kết thúc sử dụng DKIM cho JavaMail mà có thể được tải về tại địa chỉ: DKIM For Javamail

Dưới đây là một ví dụ (khá tốt của nó ghi lại trong các ví dụ trong việc tải xuống):

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

Ưu điểm của việc sử dụng điều này như trái ngược với việc thiết lập DKIM trên máy chủ thư, chẳng hạn như openDKIM với Postfix? –

+0

@Half_Duplex Lợi thế là bạn có thể sử dụng nhiều MTA mà không phải cấu hình openDKIM cho mỗi một trong số chúng – Horen

+0

Ví dụ này sử dụng phiên bản DKIM rất cũ cho Java trên Source Forge. Nó đã được chuyển đến GitHub và trở nên không hoạt động. Sau đó nó vẫn được chia thành một dự án còn hoạt động gọi là [java-utils-mail-dkim] (https://github.com/markenwerk/java-utils-mail-dkim). Bạn có thể thấy nó hoạt động trong [câu trả lời khác] của tôi (http://stackoverflow.com/a/37161192/441662) tại đây. –

2

Simple Java Mail thêm gần đây hỗ trợ ký DKIM. Dưới đây là mã của bạn, nhưng bây giờ vớ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); 
} 

Đối số khóa bí mật có thể là một File, InputStream hoặc một byte[].

Điều thú vị là, Đằng sau những cảnh đơn giản Java Mail sử dụng java-utils-mail-dkim (GitHub), đó là một ngã ba hoạt động trên không hoạt động DKIM-for-JavaMail (GitHub), đó là sự tiếp tục của thư viện bạn đang sử dụng hiện nay, DKIM For Javamail (SourceForge). Vì vậy, một trong những bạn đang sử dụng là rất cũ.

Các vấn đề liên quan