Я отправляю электронное письмо с помощью Jakarta Mail и smtp-сервера моего почтового провайдера. Я ожидал, что мне придется установить открытый ключ smtp-серверов и передать его вместе с запросом, чтобы зашифровать трафик. Однако, похоже, он работает и без этого. Этот SO-ответ (https://stackoverflow.com/a/16843712), похоже, указывает на то, что, возможно, в этом нет необходимости, потому что при наведении курсора будет использоваться сертификат, подписанный коммерческим центром сертификации. Также распечатка отладки, похоже, указывает на использование 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 отмечает отправленное письмо как непроверенное при его получении? Я подозреваю, что это как-то связано с моим первым вопросом.

unverified email image

Вот моя распечатка отладки:

ОТЛАДКА: 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]} ОТЛАДКА: Провайдеры, перечисленные по протоколу: {imap = jakarta.mail .Provider [МАГАЗИН, imap, com.sun.mail.imap.IMAPStore, Oracle], smtp = jakarta.mail.Provider [ТРАНСПОРТ, smtp, com.sun.mail.smtp.SMTPTranspor t, 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 ] DEBUG SMTP: требуется имя пользователя и пароль для аутентификации. DEBUG SMTP: protocolConnect возвращает false, host = mail.hover.com, user = paul, password = DEBUG SMTP: useEhlo true, useAuth true DEBUG SMTP: пытается подключиться к почте хоста. hover.com ", порт 465, isSSL true 220 smtp.hostedemail.com ESMTP DEBUG SMTP: подключен к хосту" mail.hover.com ", порт: 465 EHLO 192.168.0.12 250-omf04.hostedemail.com 250-PIPELINING 250- РАЗМЕР 36700160 250-ETRN 250-AUTH ОБЫЧНЫЙ ВХОД 250-AUTH = ОБЫЧНЫЙ ВХОД 250- ENHANCEDSTATUSCODES 250-8BITMIME 250-DSN 250 CHUNKING DEBUG SMTP: Найдено расширение "PIPELINING", arg "" DEBUG SMTP: Найдено расширение "SIZE", arg "36700160" DEBUG SMTP: Найдено расширение "ETRN", arg "" DEBUG SMTP " extension "AUTH", arg "PLAIN LOGIN" DEBUG SMTP: Найдено расширение "AUTH = PLAIN", arg "LOGIN" DEBUG SMTP: Найдено расширение "ENHANCEDSTATUSCODES", arg "" DEBUG SMTP: Найдено расширение "8BITMIME", arg "" DEBUG SMTP: найдено расширение "DSN", arg "" DEBUG SMTP: Найдено расширение "CHUNKING", arg "" DEBUG SMTP: protocolConnect login, host = mail.hover.com, user=myemail@mybusiness.ca, password = DEBUG SMTP: Попытка аутентификации с использованием механизмов: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 DEBUG SMTP: Использование механизма LOGIN DEBUG SMTP: AUTH LOGIN command trace отключено ОТЛАДКА SMTP: AUTH LOGIN успешно DEBUG SMTP: use8bit false MAIL FROM: myemail@mybusiness.ca ОК RCPT TO: myemail@gmail.com 250 2.1.5 ОК ОТЛАДКА 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]> Тема: А вот и Jakarta Mail! MIME-версия: 1.0 Content-Type: text / html; charset = us-ascii Content-Transfer-Encoding: 7bit Только что обнаружил, что Jakarta Mail интересна и проста в использовании 250 Ok В очереди как books05_4e0c9e627608 DEBUG SMTP: сообщение успешно доставлено на почтовый сервер QUIT 221 2.0.0 Bye Сообщение электронной почты успешно отправлено

Заранее спасибо!

0
Paul 9 Фев 2021 в 19:37

1 ответ

Лучший ответ

Во-первых, я должен отдать должное @Robert, который ответил на мой первый вопрос в своем комментарии, а в своем комментарии к моему второму вопросу он упомянул DKIM, который поставил меня на путь решения моего второго вопроса.

Итак, ответ на мой первый вопрос: в примере с jakarta mail все зашифровано, включая логин и сообщение. Вам не нужно использовать открытый ключ smpt-серверов, потому что в моем случае он использует сертификат, подписанный коммерческим центром сертификации. (согласно @Robert и https://stackoverflow.com/a/16843712)

Что касается моего второго вопроса, почему 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 -учебник /

Библиотека ожидает файл .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

0
Paul 10 Фев 2021 в 18:42