从 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

为啥 javax.mail 端口从 2525 更改为 25

MimePartBody.getDisposition() 为内联部分返回 null

javax.mail无法在Marshmallow或更高版本的系统上运行

教 javax.mail、javax.activation 在 Web 应用程序中识别邮件附件的 mime 类型

使用 javax.mail 删除服务器上的电子邮件