有没有库或没有外部库的方法?我正在使用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 中实际签名?
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);
}
私钥参数可以是File
、InputStream
或byte[]
。
有趣的是,Simple Java Mail在幕后使用java-utils-mail-dkim(GitHub),它是休眠的DKIM-for-JavaMail(GitHub)的一个活跃分支,它是你现在使用的库DKIM For Javamail(SourceForge)的延续。所以,你正在使用的那个很老。
我最终使用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();
}
}
}