Descrição da cena:
Ao salvar a configuração da caixa de correio, ele detecta automaticamente se os parâmetros de configuração da caixa de correio estão corretos. Verifica-se que ao detectar o SMTP, o sistema reporta a seguinte exceção:
Copie o código do código da seguinte forma:
javax.mail.MessagingException: 501 Comando “HELO” requer um argumento
em com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1363)
em com.sun.mail.smtp.SMTPTransport.helo(SMTPTransport.java:838)
em com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:375)
em javax.mail.Service.connect(Service.java:275)
Porém, quando mudei para um servidor Windows, descobri que esse problema não existia. Só poderia ser reproduzido em um servidor Linux. Parecia intuitivamente que havia algo errado com alguma configuração deste servidor Linux.
Etapas de solução de problemas
1. Encontre um servidor Linux com o mesmo sistema operacional, verifique a configuração do email, OK, e elimine problemas com a particularidade do sistema operacional Linux.
2. Use telnet diretamente no servidor Linux para conectar-se à porta SMTP do servidor de e-mail oposto. OK, solucione o problema de rede do servidor.
3. Encontre a explicação da instrução HELO
Copie o código do código da seguinte forma:
OLÁ
-- Inicia uma conversa com o servidor de correio Ao usar este comando você pode especificar seu nome de domínio para que o servidor de correio saiba quem você é.
Verifica-se que o comando HELO precisa ser seguido pelo nome do host do iniciador para informar ao servidor SMTP onde está a origem da mensagem.
Observando a mensagem de exceção "501 Command "HELO" requer um argumento", é óbvio que o programa não passou o nome de domínio do host de origem durante a interação com o SERVIDOR SMTP.
4. Visualize o código-fonte JAVA MAIL
Encontre a instrução HELO, como segue:
Copie o código do código da seguinte forma:
/**
* Emita o comando <code>HELO</code>.
*
*@param domínio
* nosso domínio
*
* @desde JavaMail 1.4.1
*/
protegido void helo (String domínio) lança MessagingException {
if (domínio! = nulo)
issueCommand("HELO " + domínio, 250);
outro
issueCommand("HELO", 250);
}
Descubra onde o método helo é chamado e veja como o domínio é passado
Copie o código do código da seguinte forma:
if (useEhlo)
sucesso = ehlo(getLocalHost());
se (!sucesso)
helo(getLocalHost());
Naturalmente, procure o método getLocalHost(), que é definido da seguinte forma:
Copie o código do código da seguinte forma:
/**
* Obtenha o nome do host local, para uso nos comandos EHLO e HELO.
* A propriedade mail.smtp.localhost substitui mail.smtp.localaddress, que
* substitui o que InetAddress nos diria.
*/
string sincronizada pública getLocalHost() {
tentar {
// obtém nosso nome de host e armazena-o em cache para uso futuro
if (localHostName == null || localHostName.length() <= 0)
localHostName = session.getProperty("mail." + nome + ".localhost");
if (localHostName == null || localHostName.length() <= 0)
localHostName = session.getProperty("mail." + nome+ ".localaddress");
if (localHostName == null || localHostName.length() <= 0) {
InetAddress localHost = InetAddress.getLocalHost();
localHostName = localHost.getHostName();
// se não conseguirmos nosso nome, use o endereço local literal
if (localHostName == nulo)
// XXX - não é correto para IPv6
localHostName = "[" + localHost.getHostAddress() + "]";
}
} catch (UnknownHostException uhex) {
}
retornar localHostName;
}
Você pode ver que o nome do host pode ser obtido a partir do atributo de sessão da conexão atual ou da configuração de hosts do servidor atual. No entanto, nosso programa não define o nome do host na sessão, portanto o motivo deve estar no arquivo hosts. do servidor Linux foi modificado, fazendo com que o programa JAVA não conseguisse obter automaticamente o localhostName.
5. Verifique o arquivo /etc/hosts, a situação é a seguinte:
Copie o código do código da seguinte forma:
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
Simplesmente modifique o arquivo hosts da seguinte maneira:
Copie o código do código da seguinte forma:
127.0.0.1 host local
::1 localhost6.localdomain6 localhost6
6. Teste novamente e o problema estará resolvido.
Na verdade, esta situação também pode ser evitada através da programação, ou seja, adicionando o atributo hostname do servidor atual à conexão do programa de sessão.
Copie o código do código da seguinte forma:
public static void main(String[] args) {
tentar {
int smtport = 25;
String smtpserver = "219.147.xxx.xxx";
Propriedades prop = System.getProperties();
prop.put("mail.smtp.auth", "true");
prop.put("mail.smtp.localhost", "meuMailServer");
Sessão mailSession = Session.getInstance(prop, null);
Transporte transporte = mailSession.getTransport("smtp");
transport.connect(smtpserver,smtpport, "nome de usuário", "senha");
System.out.println("conectar ok");
transporte.close();
} catch (AuthenticationFailedException pt) {
pt.printStackTrace();
System.out.println("Falha na conexão do servidor SMTP, verifique se as informações de entrada estão corretas");
} catch (NoSuchProviderException e) {
e.printStackTrace();
System.out.println("Falha na conexão do servidor SMTP, verifique se as informações de entrada estão corretas");
} catch (MessagingException e) {
e.printStackTrace();
System.out.println("Falha na conexão do servidor SMTP, verifique se as informações de entrada estão corretas");
}
}