2010-01-02 1 views
28

Я пытаюсь использовать javamail в groovy-скрипте для отправки электронной почты через gmail. Я просмотрел много мест в Интернете и не смог заставить его работать до сих пор. Ошибка я получаю при запуске мой сценарий:Использование Javamail для подключения к Gmail smtp-серверу игнорирует указанный порт и пытается использовать 25

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

ответ

28

В 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» также может быть полезен.

+4

Спасибо, что сработали! Обратите внимание, что вторым параметром connect() в int также я должен был переключить номер порта на 465, потому что это порт SSL, а 587 - для TLS. Еще раз спасибо! – Bryan

+0

Рад, что это сработало. Я думаю, что вы можете также удалить свойства mail.smtp.socketFactory. *. – maximdim

+0

Приятно это найти! В Sendgrid есть пример java [здесь] (http://sendgrid.com/docs/Code_Examples/java.html), который использует свойства, и работает отлично, если вы можете использовать порт 25, но если вам нужно переключиться, он не работает. Мой интернет-провайдер блокирует порт 25, поэтому код работал из моего офиса, но не дома, и я не мог понять, почему мой выбранный порт игнорируется. –

15

Для тех, кто ищет полное решение, я получил эту работу с помощью следующего кода на основе ответа 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(); 
+0

Это именно то, что я искал. Спасибо – Tomik

+0

Один из немногих примеров кода, который работал для меня, спасибо! – Cookie

+0

может айон, пожалуйста, посмотрите на мой вопрос, подобный этому? Http: //stackoverflow.com/questions/14209284/could-not-connect-to-smtp-host-localhost-port-25 –

2

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

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

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

+0

Спасибо! Это была моя проблема! – migmig

Смежные вопросы