Description de la scène :
Lors de l'enregistrement de la configuration de la boîte aux lettres, il détecte automatiquement si les paramètres de configuration de la boîte aux lettres sont corrects. Lors de la détection de SMTP, le système signale l'exception suivante :
Copiez le code comme suit :
javax.mail.MessagingException : 501 La commande "HELO" nécessite un argument
sur com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1363)
sur com.sun.mail.smtp.SMTPTransport.helo(SMTPTransport.java:838)
sur com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:375)
sur javax.mail.Service.connect(Service.java:275)
Cependant, lorsque je suis passé à un serveur Windows, j'ai constaté qu'il n'y avait pas de problème de ce type. Il ne pouvait être reproduit que sur un serveur Linux. Il semblait intuitivement qu'il y avait un problème avec certaines configurations de ce serveur Linux.
Étapes de dépannage
1. Recherchez un serveur Linux avec le même système d'exploitation, vérifiez la configuration de la messagerie, OK et éliminez les problèmes liés à la particularité du système d'exploitation Linux.
2. Utilisez telnet directement sur le serveur Linux pour vous connecter au port SMTP du serveur de messagerie opposé. OK, résolvez le problème réseau du serveur.
3. Trouvez l'explication des instructions HELO
Copiez le code comme suit :
HÉLO
-- Initie une conversation avec le serveur de messagerie Lorsque vous utilisez cette commande, vous pouvez spécifier votre nom de domaine afin que le serveur de messagerie sache qui vous êtes. Par exemple, HELO mailhost2.
On constate que la commande HELO doit être suivie du nom d'hôte de l'initiateur pour indiquer au serveur SMTP où se trouve la source du message.
En regardant le message d'exception "501 Command "HELO" nécessite un argument", il est évident que le programme n'a pas transmis le nom de domaine de l'hôte source lors de l'interaction avec le SERVEUR SMTP.
4. Afficher le code source de JAVA MAIL
Recherchez l'instruction HELO, comme suit :
Copiez le code comme suit :
/**
* Émettez la commande <code>HELO</code>.
*
* Domaine @param
*notre domaine
*
* @depuis JavaMail 1.4.1
*/
protected void helo (domaine String) lance MessagingException {
si (domaine != null)
issueCommand("HELO " + domaine, 250);
autre
issueCommand("HELO", 250);
}
Trouvez où la méthode helo est appelée et voyez comment le domaine est transmis
Copiez le code comme suit :
si (utiliserEhlo)
réussir = ehlo(getLocalHost());
si (!réussir)
helo(getLocalHost());
Naturellement, recherchez ensuite la méthode getLocalHost(), qui est définie comme suit :
Copiez le code comme suit :
/**
* Obtenez le nom de l'hôte local, à utiliser dans les commandes EHLO et HELO.
* La propriété mail.smtp.localhost remplace mail.smtp.localaddress, qui
* remplace ce que InetAddress nous dirait.
*/
chaîne synchronisée publique getLocalHost() {
essayer {
// récupère notre nom d'hôte et le met en cache pour une utilisation future
si (localHostName == null || localHostName.length() <= 0)
localHostName = session.getProperty("mail." + nom + ".localhost");
si (localHostName == null || localHostName.length() <= 0)
localHostName = session.getProperty("mail." + nom+ ".localaddress");
if (localHostName == null || localHostName.length() <= 0) {
InetAddress localHost = InetAddress.getLocalHost();
localHostName = localHost.getHostName();
// si nous ne pouvons pas obtenir notre nom, utilisez l'adresse locale littérale
si (localHostName == null)
// XXX - incorrect pour IPv6
localHostName = "[" + localHost.getHostAddress() + "]";
}
} catch (UnknownHostException uhex) {
}
retourner localHostName ;
}
Vous pouvez voir que le nom d'hôte peut être obtenu à partir de l'attribut de session de la connexion actuelle ou à partir de la configuration des hôtes du serveur actuel. Cependant, notre programme ne définit pas le nom d'hôte dans la session, la raison doit donc résider dans le fichier hosts. du serveur Linux a été modifié, empêchant le programme JAVA d'obtenir automatiquement localhostName.
5. Vérifiez le fichier /etc/hosts, la situation est la suivante :
Copiez le code comme suit :
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
Modifiez simplement le fichier hosts comme suit :
Copiez le code comme suit :
127.0.0.1 hôte local
::1 localhost6.localdomain6 localhost6
6. Retestez et le problème est résolu.
En fait, cette situation peut également être évitée grâce à la programmation, c'est-à-dire en ajoutant l'attribut de nom d'hôte du serveur actuel à la connexion de session. Exemple de programme :
Copiez le code comme suit :
public static void main (String[] arguments) {
essayer {
int smtpport = 25 ;
Chaîne serveur smtp = "219.147.xxx.xxx" ;
Propriétés prop = System.getProperties();
prop.put("mail.smtp.auth", "true");
prop.put("mail.smtp.localhost", "monServeurMail");
Session mailSession = Session.getInstance(prop, null);
Transport transport = mailSession.getTransport("smtp");
transport.connect(serveur smtp, port smtp, "nom d'utilisateur", "mot de passe");
System.out.println("connexion ok");
transport.close();
} catch (AuthenticationFailedException fr) {
fr.printStackTrace();
System.out.println("La connexion au serveur SMTP a échoué, veuillez vérifier si les informations saisies sont correctes");
} catch (NoSuchProviderException e) {
e.printStackTrace();
System.out.println("La connexion au serveur SMTP a échoué, veuillez vérifier si les informations saisies sont correctes");
} catch (MessagingException e) {
e.printStackTrace();
System.out.println("La connexion au serveur SMTP a échoué, veuillez vérifier si les informations saisies sont correctes");
}
}