Szenenbeschreibung:
Beim Speichern der Postfachkonfiguration wird automatisch erkannt, ob die Postfachkonfigurationsparameter korrekt sind. Beim Erkennen von SMTP wird festgestellt, dass das System die folgende Ausnahme meldet:
Kopieren Sie den Codecode wie folgt:
javax.mail.MessagingException: 501 Befehl „HELO“ erfordert ein Argument
unter com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1363)
unter com.sun.mail.smtp.SMTPTransport.helo(SMTPTransport.java:838)
unter com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:375)
unter javax.mail.Service.connect(Service.java:275)
Als ich jedoch zu einem Windows-Server wechselte, stellte ich fest, dass dieses Problem nur auf einem Linux-Server reproduziert werden konnte. Es schien intuitiv, dass mit einer Konfiguration dieses Linux-Servers etwas nicht stimmte.
Schritte zur Fehlerbehebung
1. Suchen Sie einen Linux-Server mit demselben Betriebssystem, überprüfen Sie die E-Mail-Konfiguration, OK, und beseitigen Sie Probleme mit der Besonderheit des Linux-Betriebssystems.
2. Verwenden Sie Telnet direkt auf dem Linux-Server, um eine Verbindung zum SMTP-Port des anderen Mailservers herzustellen. OK, beheben Sie das Netzwerkproblem des Servers.
3. Finden Sie die Erklärung der HELO-Anweisung
Kopieren Sie den Codecode wie folgt:
Hallo
– Initiiert eine Konversation mit dem Mailserver. Sie können Ihren Domänennamen angeben, damit der Mailserver weiß, wer Sie sind.
Es wurde festgestellt, dass dem HELO-Befehl der Hostname des Initiators folgen muss, um dem SMTP-Server mitzuteilen, wo sich die Quelle der Nachricht befindet.
Wenn man sich die Ausnahmemeldung „501 Befehl „HELO“ erfordert ein Argument“ ansieht, ist es offensichtlich, dass das Programm den Domänennamen des Quellhosts während der Interaktion mit dem SMTP-SERVER nicht übergeben hat.
4. Sehen Sie sich den JAVA MAIL-Quellcode an
Suchen Sie die HELO-Anweisung wie folgt:
Kopieren Sie den Codecode wie folgt:
/**
* Geben Sie den Befehl <code>HELO</code> aus.
*
* @param-Domäne
* unsere Domain
*
* @seit JavaMail 1.4.1
*/
protected void helo(String domain) löst MessagingException {
if (Domäne != null)
issueCommand("HELO " + domain, 250);
anders
issueCommand("HELO", 250);
}
Finden Sie heraus, wo die Helo-Methode aufgerufen wird, und sehen Sie, wie die Domäne übergeben wird
Kopieren Sie den Codecode wie folgt:
if (useEhlo)
success = ehlo(getLocalHost());
wenn (!succeed)
helo(getLocalHost());
Suchen Sie dann natürlich nach der Methode getLocalHost(), die wie folgt definiert ist:
Kopieren Sie den Codecode wie folgt:
/**
* Rufen Sie den Namen des lokalen Hosts zur Verwendung in den EHLO- und HELO-Befehlen ab.
* Die Eigenschaft mail.smtp.localhost überschreibt mail.smtp.localaddress, was
* überschreibt, was InetAddress uns sagen würde.
*/
öffentlicher synchronisierter String getLocalHost() {
versuchen {
// Holen Sie sich unseren Hostnamen und speichern Sie ihn für die zukünftige Verwendung zwischen
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();
// Wenn wir unseren Namen nicht erhalten können, verwenden Sie das lokale Adressliteral
if (localHostName == null)
// XXX – nicht korrekt für IPv6
localHostName = "[" + localHost.getHostAddress() + "]";
}
} Catch (UnknownHostException uhex) {
}
return localHostName;
}
Sie können sehen, dass der Hostname aus dem Sitzungsattribut der aktuellen Verbindung oder aus der Hosts-Konfiguration des aktuellen Servers abgerufen werden kann. Unser Programm legt den Hostnamen jedoch nicht in der Sitzung fest, daher muss der Grund in der Hosts-Datei liegen des Linux-Servers wurde geändert, was dazu führte, dass das JAVA-Programm localhostName nicht automatisch abrufen konnte.
5. Überprüfen Sie die Datei /etc/hosts. Die Situation ist wie folgt:
Kopieren Sie den Codecode wie folgt:
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
Ändern Sie einfach die Hosts-Datei wie folgt:
Kopieren Sie den Codecode wie folgt:
127.0.0.1 lokaler Host
::1 localhost6.localdomain6 localhost6
6. Erneut testen und das Problem ist gelöst.
Tatsächlich kann diese Situation auch durch Programmierung vermieden werden, d. h. durch Hinzufügen des Hostnamenattributs des aktuellen Servers zur Sitzungsverbindung. Programmbeispiel:
Kopieren Sie den Codecode wie folgt:
public static void main(String[] args) {
versuchen {
int smtpport = 25;
String smtpserver = "219.147.xxx.xxx";
Eigenschaften prop = System.getProperties();
prop.put("mail.smtp.auth", "true");
prop.put("mail.smtp.localhost", "myMailServer");
Session mailSession = Session.getInstance(prop, null);
Transport transport = mailSession.getTransport("smtp");
transport.connect(smtpserver,smtpport, „Benutzername“, „Passwort“);
System.out.println("connect ok");
transport.close();
} Catch (AuthenticationFailedException de) {
de.printStackTrace();
System.out.println("SMTP-Serververbindung fehlgeschlagen, bitte überprüfen Sie, ob die Eingabeinformationen korrekt sind");
} Catch (NoSuchProviderException e) {
e.printStackTrace();
System.out.println("SMTP-Serververbindung fehlgeschlagen, bitte überprüfen Sie, ob die Eingabeinformationen korrekt sind");
} Catch (MessagingException e) {
e.printStackTrace();
System.out.println("SMTP-Serververbindung fehlgeschlagen, bitte überprüfen Sie, ob die Eingabeinformationen korrekt sind");
}
}