Что именно зашифровано с помощью этого кода 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

Другие вопросы по тегам