Отправка почты с использованием сокета в Java - PullRequest
1 голос
/ 30 мая 2011

Я хочу написать простую программу на Java, которая может отправлять почту через сокет (не java.mail); У меня есть несколько примеров, но это не работает (вот основные проблемы):

  1. Стоит ли сначала отправлять почту на сервер smtp отправителя? (Может потребоваться указать настоящее имя пользователя и пароль).

  2. У меня есть пример, который отправляет SMTP-серверу получателя напрямую. Я использую gmail для тестирования, но он не прошел, предоставив информацию:

    530 5.7.0 Must issue a STARTTLS command first.
    

    Я думаю, это потому, что gmail нужен сокет SSL. Затем я получил простую реализацию SSL для обмена «новым сокетом», снова произошел сбой с информацией об ошибке:

    javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
    javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
    

Может быть, использование SSL не так? Это код SSL:

class Java2000TrustManager implements X509TrustManager {

Java2000TrustManager() {
}

public void checkClientTrusted(X509Certificate chain[], String authType)
        throws CertificateException {
    System.out.println("checkClientTrusted...");
}

public void checkServerTrusted(X509Certificate chain[], String authType)
        throws CertificateException {
    System.out.println("checkServerTrusted");
}

public X509Certificate[] getAcceptedIssuers() {
    System.out.println("getAcceptedIssuers...");
    return null;
}
}

Пожалуйста, дайте мне способ успешно реализовать это.

Ответы [ 2 ]

2 голосов
/ 30 мая 2011

То, что вы делаете в TrustManager, эффективно отключает необходимую проверку (проверку сертификата сервера), которая делает соединение SSL / TLS безопасным.Я был бы очень удивлен, если бы у GMail не было сертификата, выданного CA, который находится в хранилище доверенных сертификатов по умолчанию.Вам не нужно изменять какие-либо настройки доверия.

Проблема, по-видимому, связана с использованием STARTTLS, который является командой SMTP (поэтому вам может потребоваться больше узнать об этом вСпецификация SMTP.

Существует два способа включения SSL / TLS в SMTP-соединениях, как описано здесь , хотя они часто плохо маркируются (некоторые называют «TLS» тем, что есть на самом деле «using STARTTLS "):

  • Один из них" подключен "или" заранее "(я не уверен, существует ли стандартная терминология для этого).В этом случае вы устанавливаете соединение SSL или TLS перед обменом любым SMTP-сообщением.Как правило, это порт 465 для SMTP.

  • Другой - это переключение на TLS (хотя иногда он действительно работает и с SSLv3) во время обмена SMTP с использованием STARTTLSкоманда.Здесь клиент начинает общаться с сервером в виде простого текста с помощью SMTP-команд, но затем отправляет команду STARTTLS и инициирует квитирование TLS, чтобы превратить обычный сокет в SSL / TLS.Это может быть для портов 25 или 587. Для SMTP.

Насколько я знаю, Gmail поддерживает оба .

Если вы неслишком хорошо знакомый с рукопожатиями TLS и превращением простого сокета в сокет SSL / TLS (например, с Channel s и SSLEngine), вероятно, проще использовать первый метод: SSL / TLS при подключении.В этом случае просто используйте SSLSocket и SSLSocketFactory для инициации соединения.После этого вам не нужно использовать STARTTLS (как часть протокола SMTP), поскольку вы уже будете использовать SSL / TLS.

0 голосов
/ 30 мая 2011

Код реализует интерфейс X509TrustManager. Само по себе это бесполезно и служит цели, отличной от той, которая у вас есть. Если вам нужно инициализировать сокет, использующий SSL / TLS, вам нужно

  1. создать SSLSocketFactory ,
  2. создать сокет из SSLSocketFactory, который подключается к необходимому серверу через определенный порт
  3. Запись данных и чтение данных из сокета, как и с любым другим сокетом (не обремененным SSL / TLS).

Информация, связанная с данной:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...