从 MimeBodyPart javax.mail.message 中删除两个连字符
Posted
技术标签:
【中文标题】从 MimeBodyPart javax.mail.message 中删除两个连字符【英文标题】:Remove two hyphens from MimeBodyPart javax.mail.message 【发布时间】:2016-07-05 13:38:52 【问题描述】:我使用 javax.mail 1.5.5 创建了一个 s/mime
未签名的 mime 消息如下:
如您所见,部分末尾有两个连字符
我创建了 s/mime,然后删除了两个连字符,因此带符号的值不同
public class TestKepSignStackOf
private static final String UNSIGNED_MIME = "E:/sign/b/unsigned.eml";
private static final String SIGNED_VALUE = "E:/sign/b/smime.p7s";
private static final String SIGNED_MIME = "E:/sign/b/signed.eml";
public static void main(String[] a)
// create some properties and get the default Session
Properties props = new Properties();
// props.put("mail.smtp.host", host);
Session session = Session.getInstance(props, null);
// session.setDebug(debug);
MimeMessage msg = new MimeMessage(session, null);
try
// create a message
msg.addHeader("X-TR-REM-iletiTip", "standart");
msg.addHeader("X-TR-REM-iletiID", "");
msg.addHeader("X-TR-REM-iletiDetay", "detay");
msg.setFrom(new InternetAddress("mail@mail.com.tr"));
InternetAddress[] address = new InternetAddress(
"mail-test@mail.com.tr");
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject("Test 4");
msg.setSentDate(new Date());
MultipartSigned multipartSigned = new MultipartSigned();
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setText("<b>Hello World</b>", "utf-8", "html");
Multipart multiPart = new MimeMultipart();
multiPart.addBodyPart(bodyPart);
MimeBodyPart body = new MimeBodyPart();
body.setContent(multiPart);
multipartSigned.addBodyPart(body);
msg.setContent(multipartSigned);
try (OutputStream str = Files.newOutputStream(Paths
.get(UNSIGNED_MIME)))
msg.writeTo(str);
;
signMimeMessage();
MimeBodyPart attachPart = new MimeBodyPart();
attachPart.attachFile(SIGNED_VALUE,
"application/pkcs7-signature; name=smime.p7s", "base64");
attachPart.setFileName("smime.p7s");
attachPart.addHeader("Content-Description",
"S/MIME Cryptographic Signature");
multipartSigned.addBodyPart(attachPart);
msg.saveChanges();
try (OutputStream str = Files.newOutputStream(Paths
.get(SIGNED_MIME)))
msg.writeTo(str);
str.close();
catch (Exception ex)
System.out.println("error = " + ex.getMessage());
任何建议或指导将不胜感激 谢谢
【问题讨论】:
【参考方案1】:您的未签名示例是错误的。它已经是多部分/签名的消息,但未签名的消息将只包含内部多部分/混合内容。签名应该针对整个多部分/混合内容,而不是用于在多部分/签名部分中嵌入多部分/混合内容的标题和边界。
【讨论】:
亲爱的比尔,感谢您的关注。但是为什么这么难呢? 关于上面的代码我必须在下面的内容上签名,对吧? ------=_Part_1_32879825.1458340006441 Hello World ------=_Part_1_32879825.1458340006441-- 是的,我相信这是正确的,但您确实需要阅读 RFC 才能确定。 我解决了这个问题,wrapper multipart 应该写成 unsigned w/o header 谢谢 Bill【参考方案2】:问题是相关的签名过程。因此,在创建未签名文件(要签名的正文)之前,应使用 message.saveChanges() 方法保存整个消息。 更新的代码在下面
MimeBodyPart body = new MimeBodyPart();
body.setContent(multiPart);
multipartSigned.addBodyPart(body);
msg.setContent(multipartSigned);
msg.saveChanges();
try (OutputStream str = Files.newOutputStream(Paths
.get(UNSIGNED_MIME)))
body.writeTo(str);
str.close();
;
【讨论】:
以上是关于从 MimeBodyPart javax.mail.message 中删除两个连字符的主要内容,如果未能解决你的问题,请参考以下文章
解决java.lang.LinkageError: loader constraint violation: when resolving method "javax.mail.intern
MimePartBody.getDisposition() 为内联部分返回 null
javax.mail无法在Marshmallow或更高版本的系统上运行