当前位置: 首页 > 知识库问答 >
问题:

这个雅加达邮件代码到底加密了什么,为什么收到的邮件被标记为未经验证?

司凡
2023-03-14

我正在使用雅加达邮件和我的电子邮件提供商(悬停)smtp服务器发送电子邮件。我预计必须安装smtp服务器公钥,并将其与请求一起传递,以便加密通信量。然而,如果没有这一点,它似乎是有效的。这个SO答案(https://stackoverflow.com/a/16843712)似乎表明这可能没有必要,因为hover将使用由商业证书颁发机构签名的证书。此外,调试打印输出似乎表明使用了ssl。

我有两个问题。第一个是由下面的代码加密的内容:登录、电子邮件,两者兼而有之。

代码如下:

        // to and from addresses
        String to = "myemail@gmail.com";
        String from = "myemail@mycompany.com";

        final String password = "mypassword";

        String host = "mail.hover.com";
        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");

        props.put("mail.smtp.ssl.enable", "true");
        
        // works same with this commented or not
        // props.put("mail.smtp.ssl.trust", "mail.hover.com");

        props.put("mail.smtp.host", host);
        props.put("mail.smtp.port", "465");
        
        // print out debug messages
        props.put("mail.debug", "true");
        
        //create the Session object
        Session session = Session.getInstance(props, new Authenticator() {
            
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(to, password);
            }
            
        });
        
        
        try {
            //create a MimeMessage object

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
            message.setSubject("Here comes Jakarta Mail!");
            message.setContent("Just discovered that Jakarta Mail is fun and easy to use", "text/html");

            //send the email message
             Transport.send(message);
            
            // this works too
            // Transport transport = session.getTransport("smtps");
            // transport.connect("mail.hover.com", 465, username, password);
            // transport.sendMessage(message, message.getAllRecipients());

            System.out.println("Email Message Sent Successfully");

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    

    }

调试:Jakarta Mail版本2.0.0调试:成功加载资源:/META-INF/javamail.default.providers调试:加载提供程序的表调试:按类名列出的提供程序:{com.sun.Mail.smtp.smtptransport=Jakarta.Mail.provider[TRANSPORT,smtp,com.sun.Mail.smtptransport=Jakarta.Mail.provider,Oracle],com.sun.imap.imapsslstore=Jakarta.Mail.smtptransport,Oracle],com.sun.Mail.smtp.smtpssltransport=Jakarta.Mail.provider[TRANSPORT,smtps,com.sun.Mail.smtpsltransport,Oracle],com.sun.Mail.imap.imapstore=Jakarta.Mail.provider[STORE,imap,com.sun.imap.imapstore=Jakarta.Mail.provider,imap,oracle],com.sun.Mail.imapstore=Jakarta.Mail.provider[STORE,imap,com.sun.imapstore=Jakarta.Mail.provider[TRANSPORT,smtp,com.sun.Mail.smtp.smtptransport,Oracle],pop3=jakarta.mail.provider[STORE,pop3,com.sun.mail.pop3.pop3store,Oracle],imaps=jakarta.mail.provider[STORE,imaps,com.sun.mail.imap.imapsslstore,Oracle],smtps=jakarta.mail.provider[TRANSPORT,smtps,com.sun.mail.smtp.smtpsltransport,Oracle],pop3s=jakarta.mail.provider[STORE,pop3s,.mail.provider[TRANSPORT,smtp,com.sun.mail.smtp.smtptransport,Oracle]调试smtp:需要用户名和密码进行身份验证调试smtp:protocolConnect返回false,host=mail.hover.com,user=Paul,password=DEBUG smtp:useEhlo true,useAuth true调试smtp:试图连接到主机“mail.hover.com”,端口465,isSSL true 220 smtp.hostedemail.com,ESMTP调试smtp:连接到主机“mail.hover.com”,端口465 EHLO 192.168.0.12=普通登录250-ENHANCEDSTATUSCODES 250-8BitMIME 250-DSN 250分块调试SMTP:发现扩展“流水线”、arg“”调试SMTP:发现扩展“大小”、arg“36700160”调试SMTP:找到扩展名“etrn”,arg“”调试SMTP:发现扩展名“Auth”,arg“普通登录”调试SMTP:查找扩展名“AUTH=PLAIN”,arg“login”DEBUG smtp:查找扩展名“enhancedstatuscodes”,arg“DEBUG smtp:查找扩展名”8bitmime“,arg”DEBUG smtp:查找扩展名“dsn”,arg“DEBUG smtp:查找扩展名”chunking“,arg”DEBUG smtp:protocolConnect登录,host=MAIL.hover.com,user=myemail@mybusiness.ca,password=DEBUG smtp:尝试使用机制进行身份验证:登录PLAIN DIGEST-MD5 myemail@mybusiness.ca 250 2.1.0 Ok RCPT至:myemail@gmail.com 250 2.1.5 Ok调试SMTP:验证地址调试SMTP:myemail@gmail.com数据354结束数据。日期:2021年2月9日星期二10:31:07-0500(美国东部时间)从:myemail@mybusiness.ca到:myemail@gmail.com消息-id:<1880587495.0.1612884672084@[192.168.0.11]>主题:雅加达邮件来了!MIME版本:1.0内容类型:text/html;charset=us-ascii content-transfer-encoding:7bit刚刚发现雅加达邮件很有趣而且容易使用250 Ok排队为books05_4e0c9e627608 DEBUG smtp:消息成功传递到邮件服务器退出221 2.0.0 Bye Email消息成功发送

提前感谢!

共有1个答案

宁兴修
2023-03-14

首先,我必须感谢@Robert,他在评论中回答了我的第一个问题,在关于我的第二个问题的评论中,他提到了DKIM,这让我走上了解决我的第二个问题的道路。

所以我的第一个问题的答案是,在雅加达邮件示例中,包括登录和消息在内的所有内容都被加密了。您不需要使用smpt服务器公钥,因为在我的示例中,它使用由商业证书颁发机构签名的证书。(per@Robert and https://stackoverflow.com/a/16843712)

至于我的第二个问题,为什么goole在收到我的电子邮件时将其标记为未经验证,答案是在发送电子邮件时使用DKIM签名。为此,我遵循了以下步骤:

为了签署我的电子邮件,我使用了这个库:https://github.com/markenwerk/java-utils-mail-dkim。注我不得不从jakarta mail恢复到使用javax mail,因为库中的这个方法需要一个javax.mail.internet.mimeMessage DkimMessage(mimeMessage,dkimSigner);

然后我使用这个工具生成私钥和公钥:https://tools.socketlabs.com/dkim/generator,将私钥粘贴到一个文件中,并用.pem扩展名命名。

现在您必须添加一个DKIM TXT记录到您的网站DNS设置。下面是一个链接,它解释了如何:https://blog.mailtrap.io/create-dkim-tutorial/

库需要一个。der文件,因此使用openssl将。pem转换为。der,使用以下命令:openssl pkcs8-topk8-nocrypt-in mydkim.pem-out mydkim.der-outform der

然后我用下面的方法在我的电子邮件上签名,这是根据图书馆网页上的说明改编的。

private DkimMessage dkimSignMessage(MimeMessage message, String from, String signingDomain, String selector, File derFile) {    
    try {
        DkimSigner dkimSigner = new DkimSigner(signingDomain, selector, derFile);
        dkimSigner.setIdentity(from);
        dkimSigner.setHeaderCanonicalization(Canonicalization.SIMPLE);
        dkimSigner.setBodyCanonicalization(Canonicalization.RELAXED);
        dkimSigner.setSigningAlgorithm(SigningAlgorithm.SHA256_WITH_RSA);
        dkimSigner.setLengthParam(true);
        dkimSigner.setCopyHeaderFields(false);
        return new DkimMessage(message, dkimSigner);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

完成这些步骤后,谷歌不再将邮件标记为未验证。这里有一个链接,可以很好地解释DKIM:https://postmarkapp.com/guides/dkim

 类似资料:
  • 我有一个域名http://www.myacademicproject.com最后一年的IT学生/实习学生,我将向他们发送邮件。 我有一个带有我从那里向所有朋友和询问期末项目的学生发送邮件。当我将邮件发送到所有电子邮件id时,邮件会进入收件人gmail的垃圾邮件文件夹。我还将显示名称从更改为。 任何想法,以避免作为垃圾邮件? 帮助感谢!

  • 我试图用Jakarta mail 2.0.0发送邮件,但应用程序最终“冻结”,没有任何消息。当SocketFetcher类试图实例化静态“MailLogger”成员时,就会发生这种情况。我已经下载并编译了JAF2.0.0源文件。 有人看到了吗? Android Studio 4.1.1 with OpenJdk 11.0.2 on Windows 奥维

  • 我目前正在开发一个移动应用程序作为我最后一学期的项目。在我的移动应用程序中,我使用Firebase身份验证进行了此电子邮件验证。这是我执行此功能的教程(如果您感兴趣)。 Firebase登录 我这里的问题是,当我在我的移动应用程序中添加了重置密码功能(本教程的下一部分)时,即使电子邮件经过验证,电子邮件验证警报仍然存在。 设置活动(重置密码和电子邮件验证功能所在) 这是错误日志 这是设置中的图片

  • 嗯,我已经尝试了多种方法来触发函数。但没有一个成功。医生也帮不上忙。 下面是我将要使用的部分源代码。请让我知道我可以如何纠正这一点。 在我的控制台上,我得到以下错误: TypeError:无法读取Object.Firebase.auth.OnauthStateChanged.FirebaseUser[as next]中为null的属性“email verified”

  • 谢谢你的帮助。Haskell看起来很有趣,但如果没有一个好教授的指导和指导,这是一门很难学的语言。我只是想自学这门语言。

  • 我刚刚完成了Android应用程序的开发,所以现在我想发布。对于发布版,我正在使用ant命令行工具构建我的的发布版本。 我刚刚执行了命令< code>ant release并得到了这个错误 BUILD FAILED /usr/src/android-sdk-linux/tools/ant/build.xml:679:执行此行时发生以下错误: /usr/src/android-sdk-linux/t