Подтвердить что ты не робот

Использование Javamail для подключения к серверу smtp Gmail игнорирует указанный порт и пытается использовать 25

Я пытаюсь использовать javamail в groovy script для отправки электронной почты через gmail. Я просмотрел много мест в Интернете и не смог заставить его работать до сих пор. Ошибка, которую я получаю при запуске my script:

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?))

Кажется, вы пытаетесь использовать порт 25, хотя я указал, что он должен использовать порт 587. Кто-нибудь знает, что может вызвать эту проблему, я использовал telnet для подключения к SMTP-серверу на порту 587, и thunderbird использует порт 587 с безопасностью STARTTLS и может успешно отправлять почту с использованием SMTP-сервера. Это говорит мне, что это не проблема с заблокированным портом или связью. Вот код, который я использую, чтобы попробовать отправить электронное письмо:

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)

Любая помощь будет принята с благодарностью. Спасибо заранее!

-Bryan

4b9b3361

Ответ 1

В Java вы бы сделали что-то похожее на:

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

Обратите внимание на протокол "smtpS". Также свойства socketFactory больше не нужны в современных JVM, но вам может потребоваться установить "mail.smtps.auth" и "mail.smtps.starttls.enable" в "true" для Gmail. "mail.smtps.debug" также может быть полезен.

Ответ 2

Для тех, кто ищет полное решение, я получил эту работу со следующим кодом на основе ответа maximdim:

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();

Ответ 3

Может быть полезно для всех, кто сталкивается с этой проблемой: при настройке порта для свойств:

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

.. обязательно используйте строковый объект. Использование числового объекта (то есть Long) приведет к тому, что этот оператор, по-видимому, не имеет эффекта.