如何使用DKIM签署Javamail

时间:2012-12-12 05:01:24

标签: java email javamail dkim james

有没有图书馆或没有外部图书馆的方法吗?我使用apache james作为我的邮件服务器,目前发送这样的电子邮件:

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与电子邮件签名。我知道我需要在james服务器上实现DKIM签名并计划使用jDKIM来实现这一点,我也理解我需要使用像www.port25.com这样的东西来创建密钥,但是如何在java之前实际签署电子邮件我发出去了吗?

2 个答案:

答案 0 :(得分:5)

Simple Java Mail最近增加了对DKIM签名的支持。这是您的代码,但现在使用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);
}

私钥参数可以是FileInputStreambyte[]

有趣的是,幕后操作Simple Java Mail使用java-utils-mail-dkim(GitHub),这是休眠DKIM-for-JavaMail(GitHub)上的活动分支,它是您现在使用的库的延续, DKIM For Javamail(SourceForge)。所以,你正在使用的那个很老。

答案 1 :(得分:4)

我最终使用DKIM for 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();
        }   
    }           
}