Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用EWS API发送带有附件的数字签名邮件_Java_Email_Exchangewebservices - Fatal编程技术网

Java 如何使用EWS API发送带有附件的数字签名邮件

Java 如何使用EWS API发送带有附件的数字签名邮件,java,email,exchangewebservices,Java,Email,Exchangewebservices,我正在尝试使用EWS发送数字签名邮件,我已经实现了邮件签名代码。邮件成功发送,但内容为空,下面是代码,我做错了什么。感谢您的帮助 ** publicstaticemailmessagesign(EmailMessageContent) 抛出异常{ EmailMessage signedMessage=messageContent.getEmailMessage(); char[]smimePw=messageContent.getPassword().tocharray(); CMSProces

我正在尝试使用EWS发送数字签名邮件,我已经实现了邮件签名代码。邮件成功发送,但内容为空,下面是代码,我做错了什么。感谢您的帮助

**

publicstaticemailmessagesign(EmailMessageContent)
抛出异常{
EmailMessage signedMessage=messageContent.getEmailMessage();
char[]smimePw=messageContent.getPassword().tocharray();
CMSProcessableByteArray CMSProcessableByteArray=新CMSProcessableByteArray(signedMessage.getBody().toString().getBytes());
试试{
如果(签名者==null){
signer=getSigner(messageContent,smimePw);
}
cmssignedata cmssignedata=signer.generate(cmsProcessableByteArray,“BC”);
mimcontent content=新的mimcontent(“UTF-8”,cmsSignedData.getEncoded());
signedMessage.setMimeContent(内容);
signedMessage.setItemClass(“IPM.Note.SMIME”);
}捕获(异常扩展){
LOGGER.error(“In sign()方法”,exp);
}
返回签名消息;
}
专用静态CMSSignedDataGenerator getSigner(EmailMessageContent,
字符[]smimePw)
抛出KeyStoreException、IOException、NoSuchAlgorithmException、,
CertificateException,Exception,UnrecoverableKeyException,
无效算法参数异常,无此提供异常,
CertStoreException,smimeeException{
InputStream=null;
CMSSignedDataGenerator gen=新的CMSSignedDataGenerator();
试一试{
is=getCertFile(messageContent.getCertFile());
KeyStore KeyStore=KeyStore.getInstance(“PKCS12”);
加载(is,smimePw);
字符串keyAlias=getAlias(密钥库);
如果(keyAlias==null){
System.err.println();
抛出新异常(“找不到别名”);
}
PrivateKey PrivateKey=(PrivateKey)keystore.getKey(keyalis,smimePw);
如果(privateKey==null){
抛出新异常(“别名没有私钥:“+keyAlias”);
}
证书[]证书=getCertificates(密钥库、密钥别名);
//证书[]
gen.addSigner(私钥,(X509Certificate)证书[0],CMSSignedGenerator.DIGEST_MD5);
List certList=Arrays.asList(证书);
CertStore certs=CertStore.getInstance(“集合”,新集合CertStoreParameters(certList),“BC”);
gen.ADD证书和CRL(证书);
}最后{
如果(is!=null)是.close();
}
返回发电机;
}

**

我建议从hi开始,@GlenScales感谢您的帮助,我浏览了您提供的链接,并实现了代码。邮件已发送,但其内容为空,我无法找出哪里出错。@我找到了邮件内容为空的原因,cmssignedata cmssignedata=signer.generate(cmsProcessableByteArray,“BC”);MimeContent内容=新的MimeContent(“UTF-8”,(字节[])cmsSignedData.getSignedContent().getContent());signedMessage.setMimeContent(内容);signedMessage.setItemClass(“IPM.Note.SMIME.MultipartSigned”);对于只有签名的邮件,我必须使用ItemClass“IPM.Note.SMIME.MultipartSigned”,这正是我所尝试的。但我还有一个问题,那就是邮件作为附件发送。如果您知道与此相关的任何信息,请提供帮助。
public static EmailMessage sign(EmailMessageContent messageContent)
            throws Exception {
        EmailMessage signedMessage = messageContent.getEmailMessage();
        
        char[] smimePw = messageContent.getPassword().toCharArray();
        
        CMSProcessableByteArray cmsProcessableByteArray = new CMSProcessableByteArray(signedMessage.getBody().toString().getBytes());
        try{            
            if(signer==null){
                signer = getSigner(messageContent, smimePw);
            }
            CMSSignedData cmsSignedData = signer.generate(cmsProcessableByteArray,"BC");
            MimeContent content = new MimeContent("UTF-8", cmsSignedData.getEncoded());
            signedMessage.setMimeContent(content);  
            signedMessage.setItemClass("IPM.Note.SMIME");
            
        }catch(Exception exp){
            LOGGER.error("In sign() method", exp);
        }
        return signedMessage;
    }
private static CMSSignedDataGenerator getSigner(EmailMessageContent messageContent,
            char[] smimePw)
            throws KeyStoreException, IOException, NoSuchAlgorithmException,
            CertificateException, Exception, UnrecoverableKeyException,
            InvalidAlgorithmParameterException, NoSuchProviderException,
            CertStoreException, SMIMEException {
        InputStream is = null;
        CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
        try{
            is = getCertFile(messageContent.getCertFile());         
            KeyStore keystore = KeyStore.getInstance("PKCS12");
            keystore.load(is, smimePw);
            String keyAlias = getAlias(keystore); 
            if (keyAlias == null) {  
                System.err.println();  
                throw new Exception("Can't find an alias."); 
            }
            PrivateKey privateKey = (PrivateKey)keystore.getKey(keyAlias,   smimePw); 
            if (privateKey == null) {  
                throw new Exception("No private key for alias: " + keyAlias); 
            }
            Certificate[] certificates = getCertificates(keystore, keyAlias);
            //Certificate[] 
            gen.addSigner(privateKey, (X509Certificate) certificates[0], CMSSignedGenerator.DIGEST_MD5);
            List<Certificate> certList = Arrays.asList(certificates);
            CertStore certs = CertStore.getInstance("Collection",   new CollectionCertStoreParameters(certList), "BC"); 
            gen.addCertificatesAndCRLs(certs);  
        }finally{
            if(is!=null)is.close();
        }
        return gen;
    }