Descripción de la escena:
Al guardar la configuración del buzón, detecta automáticamente si los parámetros de configuración del buzón son correctos. Se encuentra que al detectar SMTP, el sistema informa la siguiente excepción:
Copie el código de código de la siguiente manera:
javax.mail.MessagingException: el comando 501 "HELO" requiere un argumento
en com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1363)
en com.sun.mail.smtp.SMTPTransport.helo(SMTPTransport.java:838)
en com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:375)
en javax.mail.Service.connect(Service.java:275)
Sin embargo, cuando cambié a un servidor Windows, descubrí que no había tal problema. Solo se podía reproducir en un servidor Linux. Intuitivamente parecía que había algún problema con alguna configuración de este servidor Linux.
Pasos para solucionar problemas
1. Busque un servidor Linux con el mismo sistema operativo, verifique la configuración del correo electrónico, OK y elimine problemas con la particularidad del sistema operativo Linux.
2. Utilice telnet directamente en el servidor Linux para conectarse al puerto SMTP del servidor de correo opuesto. Bien, solucione el problema de red del servidor.
3. Encuentre la explicación de las instrucciones HELO
Copie el código de código de la siguiente manera:
HOLA
-- Inicia una conversación con el servidor de correo. Al utilizar este comando, puede especificar su nombre de dominio para que el servidor de correo sepa quién es usted. Por ejemplo, HELO mailhost2.
Se descubre que el comando HELO debe ir seguido del nombre de host del iniciador para indicarle al servidor SMTP dónde está el origen del mensaje.
Al observar el mensaje de excepción "El comando 501 "HELO" requiere un argumento", es obvio que el programa no pasó el nombre de dominio del host de origen durante la interacción con el SERVIDOR SMTP.
4. Ver el código fuente de JAVA MAIL
Encuentre la instrucción HELO, de la siguiente manera:
Copie el código de código de la siguiente manera:
/**
* Emita el comando <code>HELO</code>.
*
* dominio @param
* nuestro dominio
*
* @desde JavaMail 1.4.1
*/
helo vacío protegido (dominio de cadena) lanza MessagingException {
si (dominio! = nulo)
emitCommand("HELO " + dominio, 250);
demás
emitirComando("HELO", 250);
}
Encuentre dónde se llama el método helo y vea cómo se pasa el dominio
Copie el código de código de la siguiente manera:
si (useEhlo)
tener éxito = ehlo(getLocalHost());
si (! tener éxito)
hola(getLocalHost());
Naturalmente, entonces busque el método getLocalHost(), que se define de la siguiente manera:
Copie el código de código de la siguiente manera:
/**
* Obtenga el nombre del host local, para usarlo en los comandos EHLO y HELO.
* La propiedad mail.smtp.localhost anula mail.smtp.localaddress, que
* anula lo que nos diría InetAddress.
*/
Cadena pública sincronizada getLocalHost() {
intentar {
// obtenemos nuestro nombre de host y lo almacenamos en caché para uso futuro
if (localHostName == null || localHostName.length() <= 0)
localHostName = session.getProperty("correo." + nombre + ".localhost");
if (localHostName == null || localHostName.length() <= 0)
localHostName = session.getProperty("correo." + nombre+ ".localaddress");
if (localHostName == null || localHostName.length() <= 0) {
InetAddress localHost = InetAddress.getLocalHost();
localHostName = localHost.getHostName();
// si no podemos obtener nuestro nombre, usamos la dirección local literal
si (localHostName == nulo)
// XXX - no es correcto para IPv6
localHostName = "[" + localHost.getHostAddress() + "]";
}
} captura (UnknownHostException uhex) {
}
devolver nombre de host local;
}
Puede ver que el nombre de host se puede obtener del atributo de sesión de la conexión actual o de la configuración de hosts del servidor actual. Sin embargo, nuestro programa no establece el nombre de host en la sesión, por lo que el motivo debe estar en el archivo de hosts. del servidor Linux se modificó, lo que provocó que el programa JAVA no pudiera obtener automáticamente el nombre de host local.
5. Verifique el archivo /etc/hosts, la situación es la siguiente:
Copie el código de código de la siguiente manera:
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
Simplemente modifique el archivo de hosts de la siguiente manera:
Copie el código de código de la siguiente manera:
127.0.0.1 servidor local
::1 localhost6.localdomain6 localhost6
6. Vuelva a realizar la prueba y el problema estará resuelto.
De hecho, esta situación también se puede evitar mediante programación, es decir, agregando el atributo de nombre de host del servidor actual a la conexión de sesión. Ejemplo de programa:
Copie el código de código de la siguiente manera:
público estático vacío principal (String [] argumentos) {
intentar {
int smtport = 25;
Cadena smtpserver = "219.147.xxx.xxx";
Propiedades prop = System.getProperties();
prop.put("mail.smtp.auth", "verdadero");
prop.put("mail.smtp.localhost", "myMailServer");
Sesión mailSession = Session.getInstance(prop, null);
Transporte transporte = mailSession.getTransport("smtp");
transport.connect(smtpserver,smtpport, "nombre de usuario", "contraseña");
System.out.println("conectar bien");
transporte.close();
} catch (AuthenticationFailedException es) {
es.printStackTrace();
System.out.println("Error en la conexión del servidor SMTP, verifique si la información ingresada es correcta");
} captura (NoSuchProviderException e) {
e.printStackTrace();
System.out.println("Error en la conexión del servidor SMTP, verifique si la información ingresada es correcta");
} captura (MessagingException e) {
e.printStackTrace();
System.out.println("Error en la conexión del servidor SMTP, verifique si la información ingresada es correcta");
}
}