Android意图与p7s数字签名签名的电子邮件



我试图发送一个意图由用户选择的电子邮件应用程序处理。该意图有一个签名作为附件。我读到Gmail应用程序不能处理自定义mime类型,所以我点击K-9 Mail来处理意图。

Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"foo@bar.com"});
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email test");
emailIntent.putExtra(Intent.EXTRA_TEXT, confirmEmailBody);
emailIntent.putExtra(Intent.EXTRA_STREAM, uriSigned);
emailIntent.setType("application/pkcs7-signature");
try {
    startActivity(Intent.createChooser(emailIntent, "Sending email..."));
} catch (android.content.ActivityNotFoundException ex) {
    Toast.makeText(this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}

我已经从p7s文件(存在于SD卡上)中进行了unissigned,该文件是由字符串confirmEmailBody生成的。上面的意图像这样设置附件属性:

Content-Transfer-Encoding: base64
Content-Type: application/pkcs7-signature;
 name="smime.p7s"
Content-Disposition: attachment;
 filename="smime.p7s";
 size=1886

然而,附件没有被发现为签名,因为一般的电子邮件内容类型(位于发件人信息,时间等旁边)是多部分/混合的,而它应该是多部分/签名的。如何在意图中设置标题,使其最终成为内容类型:multipart/signed;中的电子邮件?

作为签名出现后,我将查看它是否会根据电子邮件的正文进行验证。

注:当然,我可以使用javamail轻松地发送正确签名的电子邮件,但我希望避免询问用户手机的gmail密码。

由于我没有设法找到一种方法来使这个工作的方式我想,我应该张贴我的替代方法来解决这个问题,仍然避免要求密码。我使用Google Play Services获得Auth2 token。

String token = GoogleAuthUtil.getToken(context, userEmail, "oauth2:https://mail.google.com/");
SMTPTransport smtpTransport = connectToSmtp("smtp.gmail.com", 587, userEmail, token, true);
SMTPMessage smtpMessage = new SMTPMessage(smtpSession);
smtpMessage.setFrom(new InternetAddress(userEmail));
smtpMessage.addRecipient(Message.RecipientType.TO, toAddress);
smtpMessage.setSubject(subject);
smtpMessage.setContent(multipart, multipart.getContentType());
smtpMessage.saveChanges();
smtpTransport.sendMessage(smtpMessage, smtpMessage.getAllRecipients());
smtpTransport.close();

当然,您可以选择适合您需要的oauth2作用域。设置SMTPTransport以接受令牌(并为上面的代码创建smtpSession):

private SMTPTransport connectToSmtp(String host, int port, String userEmail, String oauthToken, boolean debug) throws Exception {
        Properties props = new Properties();
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.starttls.required", "true");
        props.put("mail.smtp.sasl.enable", "true");
        props.put("mail.smtp.sasl.mechanisms", "XOAUTH2");
        props.put("mail.imaps.sasl.mechanisms.oauth2.oauthToken", oauthToken);
        smtpSession = Session.getInstance(props);
        smtpSession.setDebug(debug);
        final URLName unusedUrlName = null;
        SMTPTransport transport = new SMTPTransport(smtpSession, unusedUrlName);
        // If the password is non-null, SMTP tries to do AUTH LOGIN.
        final String emptyPassword = null;
        transport.connect(host, port, userEmail, emptyPassword);
        byte[] responseTemp = String.format("user=%s1auth=Bearer %s11", userEmail, oauthToken).getBytes();
        byte[] response = BASE64EncoderStream.encode(responseTemp);
        transport.issueCommand("AUTH XOAUTH2 " + new String(response), 235);
        return transport;
}

有关更多信息,请参阅以下链接:在Android上使用Google授权,OAuth2 info

相关内容

  • 没有找到相关文章

最新更新