Описание сцены:
При сохранении конфигурации почтового ящика автоматически определяется правильность параметров конфигурации почтового ящика. Обнаружено, что при обнаружении SMTP система сообщает о следующем исключении:
Скопируйте код кода следующим образом:
javax.mail.MessagingException: 501 Команда «HELO» требует аргумента
по адресу com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1363)
по адресу com.sun.mail.smtp.SMTPTransport.helo(SMTPTransport.java:838)
по адресу com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:375)
в javax.mail.Service.connect(Service.java:275)
Однако, когда я перешел на сервер Windows, я обнаружил, что такой проблемы нет. Ее можно было воспроизвести только на сервере Linux. Интуитивно казалось, что с какой-то конфигурацией этого сервера Linux что-то не так.
Действия по устранению неполадок
1. Найдите сервер Linux с той же операционной системой, проверьте конфигурацию электронной почты, нажмите «ОК» и устраните проблемы, связанные с особенностями операционной системы Linux.
2. Используйте telnet непосредственно на сервере Linux для подключения к порту SMTP противоположного почтового сервера. Хорошо, устраните сетевую проблему сервера.
3. Найдите объяснение инструкции HELO.
Скопируйте код кода следующим образом:
ПРИВЕТ
-- Инициирует диалог с почтовым сервером. При использовании этой команды вы можете указать свое доменное имя, чтобы почтовый сервер знал, кто вы. Например, HELO mailhost2.
Обнаружено, что за командой HELO должно следовать имя хоста инициатора, чтобы сообщить SMTP-серверу, где находится источник сообщения.
Глядя на сообщение об исключении «501 Команда «HELO» требует аргумента», становится очевидным, что программа не передала доменное имя исходного хоста во время взаимодействия с SMTP-СЕРВЕРОМ.
4. Просмотр исходного кода JAVA MAIL.
Найдите инструкцию HELO следующим образом:
Скопируйте код кода следующим образом:
/**
* Введите команду <code>HELO</code>.
*
* Домен @param
* наш домен
*
* @с момента JavaMail 1.4.1
*/
protected void helo (домен String) выдает MessagingException {
если (домен!= ноль)
IssueCommand("HELO " + домен, 250);
еще
IssueCommand("HELO", 250);
}
Найдите, где вызывается метод helo, и посмотрите, как передается домен.
Скопируйте код кода следующим образом:
если (используйте Ehlo)
успех = ehlo (getLocalHost());
если (!успех)
Хело (getLocalHost());
Естественно, затем найдите метод getLocalHost(), который определен следующим образом:
Скопируйте код кода следующим образом:
/**
* Получите имя локального хоста для использования в командах EHLO и HELO.
* Свойство mail.smtp.localhost переопределяет mail.smtp.localaddress, который
* переопределяет то, что нам скажет InetAddress.
*/
общедоступная синхронизированная строка getLocalHost() {
пытаться {
// получаем имя хоста и кэшируем его для будущего использования
if (localHostName == null || localHostName.length() <= 0)
localHostName = session.getProperty("mail." + name + ".localhost");
if (localHostName == null || localHostName.length() <= 0)
localHostName = session.getProperty("mail." + name+ ".localaddress");
if (localHostName == null || localHostName.length() <= 0) {
InetAddress localHost = InetAddress.getLocalHost();
localHostName = localHost.getHostName();
// если мы не можем получить наше имя, используйте литерал локального адреса
если (localHostName == null)
// XXX — неверно для IPv6
localHostName = "[" + localHost.getHostAddress() + "]";
}
} catch (UnknownHostException uhex) {
}
вернуть имя локального хоста;
}
Вы можете видеть, что имя хоста можно получить из атрибута сеанса текущего соединения или из конфигурации хостов текущего сервера. Однако наша программа не устанавливает имя хоста в сеансе, поэтому причина должна лежать в файле хостов. сервера Linux был изменен, в результате чего программа JAVA не смогла автоматически получить localhostName.
5. Проверьте файл /etc/hosts, ситуация следующая:
Скопируйте код кода следующим образом:
127.0.0.1 localhost.localdomain локальный хост
::1 localhost6.localdomain6 localhost6
Просто измените файл хостов следующим образом:
Скопируйте код кода следующим образом:
127.0.0.1 локальный хост
::1 localhost6.localdomain6 localhost6
6. Повторите проверку и проблема решена.
На самом деле, этой ситуации также можно избежать с помощью программирования, то есть добавив атрибут имени хоста текущего сервера в соединение сеанса. Пример программы:
Скопируйте код кода следующим образом:
public static void main(String[] args) {
пытаться {
интервал smtpport = 25;
Строка smtpserver = "219.147.xxx.xxx";
Свойства prop = System.getProperties();
prop.put("mail.smtp.auth", "истина");
prop.put("mail.smtp.localhost", "myMailServer");
Сеанс mailSession = Session.getInstance(prop, null);
Транспортный транспорт = mailSession.getTransport("smtp");
Transport.connect(smtpserver,smtpport, «имя пользователя», «пароль»);
System.out.println("подключиться ок");
транспорт.закрыть();
} catch (AuthenticationFailedException ru) {
ru.printStackTrace();
System.out.println("Не удалось подключиться к SMTP-серверу, проверьте правильность введенной информации");
} catch (NoSuchProviderException e) {
е.printStackTrace();
System.out.println("Не удалось подключиться к SMTP-серверу, проверьте правильность введенной информации");
} catch (MessagingException e) {
е.printStackTrace();
System.out.println("Не удалось подключиться к SMTP-серверу, проверьте правильность введенной информации");
}
}