Что именно зашифровано с помощью этого кода Jakarta Mail и почему полученное письмо помечено как непроверенное?
Я отправляю электронное письмо с помощью Jakarta Mail и smtp-сервера моего почтового провайдера. Я ожидал, что мне придется установить открытый ключ smtp-серверов и передать его вместе с запросом, чтобы зашифровать трафик. Однако, похоже, он работает и без этого. Этот ответ SO ( /questions/9169148/proverka-podlinnosti-pochtyi-tls-java/9169163#9169163), похоже, указывает на то, что это может быть необязательно, потому что при наведении курсора будет использоваться сертификат, подписанный коммерческим центром сертификации. Также распечатка отладки, похоже, указывает на использование ssl.
У меня 2 вопроса. Во-первых, именно то, что зашифровано приведенным ниже кодом: логин, адрес электронной почты, оба или ни один.
Вот код:
// 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);
}
}
Мой второй вопрос: почему Google отмечает отправленное письмо как непроверенное при его получении? Я подозреваю, что это как-то связано с моим первым вопросом.
Вот моя распечатка отладки:
ОТЛАДКА: Jakarta Mail версии 2.0.0 ОТЛАДКА: успешно загруженный ресурс: /META-INF/javamail.default.providers ОТЛАДКА: таблицы загруженных поставщиков ОТЛАДКА: поставщики, перечисленные по имени класса: {com.sun.mail.smtp.SMTPTransport = jakarta .mail.Provider [ТРАНСПОРТ, smtp, com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore =jakarta.mail.Provider [STORE, imaps, com.sun.mail.imap. IMAPSSLStore, Oracle], com.sun.mail.pop3.POP3Store =jakarta.mail.Provider [STORE, pop3, com.sun.mail.pop3.POP3Store, Oracle], com.sun.mail.smtp.SMTPSSLTransport = jakarta. mail.Provider [ТРАНСПОРТ, smtps, com.sun.mail.smtp.SMTPSSLTransport, Oracle], com.sun.mail.imap.IMAPStore =jakarta.mail.Provider [STORE, imap, com.sun.mail.imap.IMAPStore , Oracle], com.sun.mail.pop3.POP3SSLStore =jakarta.mail.Provider [STORE, pop3s, com.sun.mail.pop3.POP3SSLStore, Oracle]} DEBUG: Провайдеры, перечисленные по протоколу:{imap =jakarta.mail.Provider [STORE, imap, com.sun.mail.imap.IMAPStore, Oracle], smtp =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 [ТРАНСПОРТ, smtps, com.sun.mail.smtp.SMTPSSLTransport, Oracle], pop3s =jakarta.mail.Provider [STORE, pop3s, com.sun.mail.pop3.POP3SSLStore,Oracle]} ОТЛАДКА: успешно загруженный ресурс: /META-INF/javamail.default.address.map ОТЛАДКА: getProvider () возвращает jakarta.mail.Provider [TRANSPORT, smtp, com.sun.mail.smtp.SMTPTransport,Oracle] ОТЛАДКА SMTP: требуется имя пользователя и пароль для аутентификации. DEBUG SMTP: protocolConnect, возвращающий false, host = mail.hover.com, user = paul, password = DEBUG SMTP: useEhlo true,useAuth true DEBUG SMTP: пытаюсь подключиться к хосту mail.hover.com, порт 465, isSSL true 220 smtp.hostedemail.com ESMTP DEBUG SMTP: подключен к хосту mail.hover.com, порт: 465 EHLO 192.168.0.1. 0.12250-omf04.hostedemail.com 250-PIPELINING 250-SIZE 36700160 250-ETRN250-AUTH ОБЫЧНЫЙ ВХОД 250-AUTH= ОБЫЧНЫЙ ВХОД 250-ENHANCEDSTATUSCODES250-8BITMIME 250-DSN 250 CHUNKING DEBUG SMTPING: обнаружено расширение "PIP "" DEBUG SMTP: Найдено расширение "SIZE", arg"36700160" DEBUG SMTP: Найдено расширение "ETRN", arg "" DEBUG SMTP: Найдено расширение "AUTH", arg "PLAIN LOGIN" DEBUG SMTP: Найдено расширение "AUTH=PLAIN", arg"LOGIN"DEBUG SMTP: Найдено расширение"ENHANCEDSTATUSCODES", arg""DEBUG SMTP: Найдено расширение"8BITMIME",arg""ОТЛАДКА SMTP: найдено расширение" DSN ", arg""ОТЛАДКА SMTP: найдено расширение"CHUNKING", arg""ОТЛАДКА SMTP: протокол подключения логина, host = mail.hover.com, user = myemail @ mybusiness. ca, пароль = DEBUG SMTP: Попытка аутентификации с использованием механизмов: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 DEBUG SMTP: Использование механизма LOGIN DEBUG SMTP:AUTH LOGIN command trace отключено DEBUG SMTP:AUTH LOGIN успешно DEBUGem SMTP: use8bit mybusiness.ca 250 2.1.0Ok RCPT TO:myemail@gmail.com 250 2.1.5 Ok ОТЛАДКА SMTP: проверенные адреса ОТЛАДКА SMTP: myemail@gmail.com ДАННЫЕ 354 Окончание данных с. Дата: вторник, 9 февраля 2021, 10:31 : 07 -0500 (EST) От: myemail@mybusiness.ca Кому: myemail@gmail.com Идентификатор сообщения: <1880587495.0.1612884672084@[192.168.0.11]> Тема: А вот и почта Джакарты! MIME-версия:1.0 Content-Type: текст /html;charset=us-ascii Content-Transfer-Encoding: 7bit Только что обнаружил, что Jakarta Mail интересна и проста в использовании 250 Ok В очереди как books05_4e0c9e627608 DEBUG SMTP: сообщение успешно доставлено на почтовый сервер QUIT 221 2.0.0 Bye Email Message успешно отправлено
Заранее спасибо!
1 ответ
Во-первых, я должен отдать должное @Robert, который ответил на мой первый вопрос в своем комментарии, а в своем комментарии к моему второму вопросу он упомянул DKIM, который поставил меня на путь решения моего второго вопроса.
Итак, ответ на мой первый вопрос: в примере с почтой из Джакарты все зашифровано, включая логин и сообщение. Вам не нужно использовать открытый ключ smpt-серверов, потому что в моем случае он использует сертификат, подписанный коммерческим центром сертификации. (за @Robert и /questions/9169148/proverka-podlinnosti-pochtyi-tls-java/9169163#9169163)
Что касается моего второго вопроса, почему goole помечает мои электронные письма как непроверенные при их получении, ответ заключается в том, чтобы подписывать электронные письма с помощью DKIM при их отправке. Для этого я выполнил следующие шаги:
Для подписи своих писем я использовал эту библиотеку: https://github.com/markenwerk/java-utils-mail-dkim . Примечание. Мне пришлось вернуться к использованию почты javax из почты jakarta, потому что этот метод в библиотеке ожидает 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, поэтому преобразуйте .pem в .der с помощью openssl с помощью этой команды: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;
}
}
После выполнения этих шагов Google больше не помечает письмо как неподтвержденное. Вот ссылка с хорошим объяснением DKIM: https://postmarkapp.com/guides/dkim