9 Stimmen

JavaMail-Problem: Befehl kann nicht an SMTP-Host gesendet werden

Ich versuche, Java-Mail zu tun und im immer eine Fehlermeldung "Cant senden Befehl an SMTP-Host". Für jede Hilfe wäre ich dankbar. Und alle zukünftigen Lösungen für Probleme, wenn möglich. Die genaue Exception lautet

javax.mail.MessagingException: Can't send command to SMTP host;
  nested exception is:
    java.net.SocketException: Connection closed by remote host
    at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:2106)
    at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:2093)
    at com.sun.mail.smtp.SMTPTransport.close(SMTPTransport.java:1184)
    at javax.mail.Transport.send0(Transport.java:197)
    at javax.mail.Transport.send(Transport.java:124)
    at TestEmail.main(TestEmail.java:45)
    at __SHELL17.run(__SHELL17.java:6)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at bluej.runtime.ExecServer$3.run(ExecServer.java:774)
Caused by: java.net.SocketException: Connection closed by remote host
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkWrite(SSLSocketImpl.java:1186)
    at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:43)
    at com.sun.mail.util.TraceOutputStream.write(TraceOutputStream.java:114)
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
    at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:2104)
    ... 11 more

Mein Code lautet wie folgt

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

// Send a simple, single part, text/plain e-mail
public class TestEmail {

    public static void main(String[] args) {

        // SUBSTITUTE YOUR EMAIL ADDRESSES HERE!!!
        String to = "my gmail account whose name i removed for publicity";
        String from = "my hotmail account whose name i removed for publicity";
        // SUBSTITUTE YOUR ISP'S MAIL SERVER HERE!!!
        String host = "smtp.live.com";

        // Create properties, get Session
        Properties props = new Properties();

        // If using static Transport.send(),
        // need to specify which host to send it to
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.starttls.enable", "true");
        // To see what is going on behind the scene
        props.put("mail.debug", "true");
        Session session = Session.getInstance(props);

        try {
            // Instantiatee a message
            Message msg = new MimeMessage(session);

            //Set message attributes
            msg.setFrom(new InternetAddress(from));
            InternetAddress[] address = {new InternetAddress(to)};
            msg.setRecipients(Message.RecipientType.TO, address);
            msg.setSubject("Test E-Mail through Java");
            msg.setSentDate(new Date());

            // Set message content
            msg.setText("This is a test of sending a " +
                        "plain text e-mail through Java.\n" +
                        "Here is line 2.");

            //Send the message
            Transport.send(msg);
        }
        catch (MessagingException mex) {
            // Prints all nested (chained) exceptions as well
            mex.printStackTrace();
        }
    }
}

13voto

vissu Punkte 1821

Heute hatte ich das gleiche Problem. Aber für mich ist das Problem, in smtp Server TLS war nicht aktiviert. Also habe ich die Mail-Eigenschaften wie folgt geändert.
mail.smtp.starttls.enable=false

Jetzt funktioniert alles gut für mich.

3voto

Donn Lee Punkte 2694

In meinem Fall konnte ich das Root-Problem finden, nachdem ich das Mailer-Debugging aktiviert hatte.

Verschiedene Möglichkeiten, das Mailer-Debugging zu aktivieren:

java -Dmail.debug=true ...

props.put("mail.smtp.starttls.enable", "true");
props.put("mail.debug", "true");

Jenkins-Konfiguration (/etc/default/jenkins):

JAVA_ARGS="-Dmail.smtp.starttls.enable=true -Dmail.debug=true"

Mehr Informationen: http://www.oracle.com/technetwork/java/faq-135477.html

Mein spezieller Fehler war, dass ich bei der Erstellung der E-Mail eine falsche Adresse in der "von:"-Zeile angegeben hatte. Bei Google "G Suite" (Google Apps for Business) muss die Absenderadresse in derselben Domäne wie der Kontoinhaber liegen. Beispiel: meinFirmenname.com

Das Mailer-Debugging ergab:

MAIL FROM:<jenkins-pipeline@bogusdomain.com> 550-5.7.1 Invalid credentials for relay [192.168.42.42]. The IP address you've 550-5.7.1 registered in your G Suite SMTP Relay service doesn't match domain of 550-5.7.1 the account this email is being sent from. If you are trying to relay 550-5.7.1 mail from a domain that isn't registered under your G Suite account

1voto

Jim Garrison Punkte 83143

Der Server benötigt STARTTLS. So sieht es aus, wenn ich eine manuelle SMTP-Sitzung mit Telnet durchführe:

220 BLU0-SMTP122.phx.gbl Microsoft ESMTP MAIL Service, Version: 6.0.3790.4675 ready at  Mon, 18 Jul 2011 17:08:14 -0700
HELO jhmg.net
250 BLU0-SMTP122.phx.gbl Hello [70.123.155.64]
MAIL FROM:<zzz@zzz.com>
530 5.7.0 Must issue a STARTTLS command first

Dieser Server akzeptiert keine unverschlüsselten Verbindungen

0voto

Manish Mudgal Punkte 1106

Versuchen Sie, die Adresse von hinzuzufügen

mail.setFromAddress("Name");

0voto

Fakipo Punkte 97

Sie müssen ssl trust auf smtp.gmail.com setzen

properties.put("mail.smtp.ssl.trust", "smtp.gmail.com");

und Authenticator als Parameter für die Sitzung

        Session session = Session.getDefaultInstance(properties,new javax.mail.Authenticator(){
            protected PasswordAuthentication getPasswordAuthentication() {

                return new PasswordAuthentication(
                        sender, senderPassword);// Specify the Username and the PassWord
            }
        });

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X