我正在使用雅加达邮件和我的电子邮件提供商(悬停)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消息成功发送
提前感谢!
首先,我必须感谢@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