Как проверить работоспособность SMTP почтового сервиса на почтовом сервере
Я работаю над проектом по автоматической настройке параметров почтового сервера пользователя в Java. Я извлекаю почтовый сервер из его адреса электронной почты и просматриваю записи MX этого почтового сервера, используя DirContext
класс с com.sun.jndi.dns.DnsContextFactory
,
Тогда я открываю Socket
на каждый сервер и тестирование их с помощью HELO
Команда и проверка ответов.
Моя проблема в том, что это работает, только когда я тестирую его с незащищенным SMTP-портом 25. Как я могу использовать его с защищенным портом 465?
Я пытался использовать безопасные сокеты с помощью
SSLSocketFactory sslsocketfactory = (SSLSocketFactory)SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket)sslsocketfactory.createSocket(mailserver, STANDARD_SMTP_PORT);
Но все соединения получают исключение тайм-аута следующим образом
alt1.gmail-smtp-in.l.google.com. java.net.ConnectException: Operation timed out
Пожалуйста помоги.
Дополнительная информация: я не создаю почтовый клиент. Это должно упростить настройки почтового сервера для уже существующего почтового клиента.
2 ответа
SMTP-SSL (порт 465) afaik устарел, поэтому вместо того, чтобы пытаться подключиться к сокету ssl, вы фактически подключите "открытый текст" на порт 25 (или 587 для соединений с аутентификацией smtp), но отправите EHLO вместо HELO и посмотрите, Сервер поддерживает STARTTLS, который заменяет устаревший SMTP-SSL. после того, как клиент отправит команду STARTTLS, соединение зашифровано, поэтому порт 25 сам по себе не является "небезопасным"
telnet alt1.gmail-smtp-in.l.google.com 25
Trying 173.194.71.26...
Connected to alt1.gmail-smtp-in.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP i7si4620651lbb.76
EHLO myserver.com
250-mx.google.com at your service, [x.x.x.x]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS <<--------- this is what you're looking for
250 ENHANCEDSTATUSCODES
STARTTLS <<--- client command to actually start encrypting the traffic
220 2.0.0 Ready to start TLS
Вы аутентифицировали программу перед установлением соединения с сервером. Каждый удаленный почтовый сервер должен будет аутентифицировать машину, пытаясь установить сокет-соединение. Если вы используете библиотеку javaMail, например, вам будет предложено добавить имя пользователя и пароль. Вам нужно будет найти обходной путь при использовании простых сокетов в Java