如何使用DKIM对Javamail进行签名

11

有没有不需要外部库的方式或库来完成这个任务?我正在使用 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个回答

11

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)的续集。所以,你正在使用的这个很老了。


我刚刚使用了 java-utils-mail-dkim,它非常好用 - 感谢您让我知道它的存在。 - Ron McLeod

4

我最终使用了Javamail的DKIM,可以在以下网址下载:

Javamail的DKIM

这是一个示例(在下载的示例中有很好的文档记录):

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

与在邮件服务器上设置openDKIM和Postfix等DKIM相比,使用此方法的优点是什么? - Half_Duplex
@Half_Duplex 的优点是您可以使用多个MTA,而无需为每个MTA配置openDKIM。 - Horen
3
这个例子使用了一个非常旧版本的Java DKIM工具,它原本在Source Forge上,但现在已经转移到GitHub并停止维护。后来有人从中进行分支并创建了一个仍在活跃维护的项目,叫做java-utils-mail-dkim。你可以在我其他回答中看到它的运作。 - Benny Bottema

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接