web-dev-qa-db-de.com

Wenn Sie mit Javamail eine Verbindung zum Gmail-SMTP-Server herstellen, wird der angegebene Port ignoriert und versucht, 25 zu verwenden

Ich versuche, Javamail in einem fetzigen Skript zu verwenden, um eine E-Mail über Google Mail zu versenden. Ich habe an vielen Stellen online nachgesehen und konnte es bisher nicht zum Laufen bringen. Die Fehlermeldung beim Ausführen meines Skripts lautet:

DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to Host "smtp.gmail.com", port 25, isSSL false
Caught: javax.mail.SendFailedException: Send failure (javax.mail.MessagingException: Could not connect to SMTP Host: smtp.gmail.com, port: 25 (javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?))

Es scheint zu versuchen, Port 25 zu verwenden, obwohl ich angegeben habe, dass Port 587 verwendet werden soll. Weiß jemand, was dieses Problem verursachen könnte, habe ich Telnet verwendet, um eine Verbindung zum SMTP-Server auf Port 587 herzustellen, und Thunderbird verwendet Port 587 mit STARTTLS-Sicherheit und kann erfolgreich E-Mails über den SMTP-Server senden. Dies sagt mir, dass es sich nicht um ein blockiertes Port- oder Konnektivitätsproblem handelt. Hier ist der Code, mit dem ich versuche, die E-Mail zu senden:

import javax.mail.*
import javax.mail.internet.*

private class SMTPAuthenticator extends Authenticator
{
    public PasswordAuthentication getPasswordAuthentication()
    {
        return new PasswordAuthentication('[email protected]', 'password');
    }
}

def  d_email = "[email protected]",
        d_password = "password",
        d_Host = "smtp.gmail.com",
        d_port  = "587", //465,587
        m_to = "[email protected]",
        m_subject = "Testing",
        m_text = "This is a test."

def props = new Properties()
props.put("mail.smtp.user", d_email)
props.put("mail.smtp.Host", d_Host)
props.put("mail.smtp.port", d_port)
props.put("mail.smtp.starttls.enable","true")
props.put("mail.smtp.debug", "true");
props.put("mail.smtp.auth", "true")
props.put("mail.smtp.socketFactory.port", d_port)
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory")
props.put("mail.smtp.socketFactory.fallback", "false")

def auth = new SMTPAuthenticator()
def session = Session.getInstance(props, auth)
session.setDebug(true);

def msg = new MimeMessage(session)
msg.setText(m_text)
msg.setSubject(m_subject)
msg.setFrom(new InternetAddress(d_email))
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(m_to))
Transport.send(msg)

Jede Hilfe wäre sehr dankbar. Danke im Voraus!

-Bryan

31
Bryan

In Java würden Sie etwas Ähnliches tun wie:

Transport transport = session.getTransport("smtps");
transport.connect (smtp_Host, smtp_port, smtp_username, smtp_password);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();    

Beachten Sie das SMTPS-Protokoll. Auch SocketFactory-Eigenschaften sind in modernen JVMs nicht mehr erforderlich. Möglicherweise müssen Sie jedoch "mail.smtps.auth" und "mail.smtps.starttls.enable" für Google Mail auf "true" setzen. 'mail.smtps.debug' könnte ebenfalls hilfreich sein.

31
maximdim

Für alle, die nach einer vollständigen Lösung suchen, habe ich diesen Code mit dem folgenden Code basierend auf der Antwort von maximdim zum Laufen gebracht:

import javax.mail.*
import javax.mail.internet.*

private class SMTPAuthenticator extends Authenticator
{
    public PasswordAuthentication getPasswordAuthentication()
    {
        return new PasswordAuthentication('[email protected]', 'test1234');
    }
}

def  d_email = "[email protected]",
        d_uname = "email",
        d_password = "password",
        d_Host = "smtp.gmail.com",
        d_port  = "465", //465,587
        m_to = "[email protected]",
        m_subject = "Testing",
        m_text = "Hey, this is the testing email."

def props = new Properties()
props.put("mail.smtp.user", d_email)
props.put("mail.smtp.Host", d_Host)
props.put("mail.smtp.port", d_port)
props.put("mail.smtp.starttls.enable","true")
props.put("mail.smtp.debug", "true");
props.put("mail.smtp.auth", "true")
props.put("mail.smtp.socketFactory.port", d_port)
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory")
props.put("mail.smtp.socketFactory.fallback", "false")

def auth = new SMTPAuthenticator()
def session = Session.getInstance(props, auth)
session.setDebug(true);

def msg = new MimeMessage(session)
msg.setText(m_text)
msg.setSubject(m_subject)
msg.setFrom(new InternetAddress(d_email))
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(m_to))

Transport transport = session.getTransport("smtps");
transport.connect(d_Host, 465, d_uname, d_password);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
17
Bryan

Vielleicht nützlich für alle anderen, die auf dieses Problem stoßen: Beim Festlegen des Ports in den Eigenschaften:

props.put("mail.smtp.port", smtpPort);

..Stellen Sie sicher, dass Sie ein String-Objekt verwenden. Die Verwendung eines numerischen (dh langen) Objekts hat scheinbar keine Auswirkung auf diese Anweisung.

3
uncrase