2010-01-02 39 views
28

Tôi đang cố gắng sử dụng javamail trong một tập lệnh groovy để gửi email qua gmail. Tôi đã xem nhiều nơi trực tuyến và không thể làm cho nó hoạt động cho đến nay. Các lỗi tôi nhận được khi chạy kịch bản của tôi là:Sử dụng Javamail để kết nối với máy chủ SMTP smtp bỏ qua cổng được chỉ định và cố gắng sử dụng 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?)) 

Nó dường như cố gắng sử dụng cổng 25 mặc dù tôi đã xác định rằng nó nên sử dụng cổng 587. Có ai biết những gì có thể gây ra vấn đề này , Tôi đã sử dụng telnet để kết nối với máy chủ smtp trên cổng 587 và thunderbird sử dụng cổng 587 với bảo mật STARTTLS và có thể gửi thư thành công bằng máy chủ smtp. Điều này nói với tôi rằng nó không phải là một cổng bị chặn hoặc vấn đề kết nối. Đây là mã tôi đang sử dụng để thử và gửi email:

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) 

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn trước!

-Bryan

Trả lời

28

Trong Java bạn sẽ làm điều gì đó tương tự như: giao thức 'smtpS'

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

Note. Ngoài ra các thuộc tính socketFactory không còn cần thiết trong các JVM hiện đại nhưng bạn có thể cần phải đặt 'mail.smtps.auth' và 'mail.smtps.starttls.enable' thành 'true' cho Gmail. 'mail.smtps.debug' cũng có thể hữu ích.

+4

Cảm ơn bạn đã làm việc! Lưu ý rằng tham số thứ hai để kết nối() trong một int, tôi cũng phải chuyển số cổng thành 465 vì đó là cổng SSL, trong khi 587 là cho TLS. Cảm ơn bạn lần nữa! – Bryan

+0

Vui vì nó hoạt động. Tôi nghĩ rằng bạn có thể thả mail.smtp.socketFactory. * Tài sản là tốt. – maximdim

+0

Rất vui được tìm thấy điều này! Sendgrid có một ví dụ java [ở đây] (http://sendgrid.com/docs/Code_Examples/java.html) sử dụng Properties, và hoạt động tốt nếu bạn có thể sử dụng cổng 25, nhưng nếu bạn phải chuyển đổi, nó không thành công. ISP của tôi chặn cổng 25, vì vậy mã đó đang hoạt động từ văn phòng của tôi, nhưng không phải ở nhà và tôi không thể tìm ra lý do tại sao cổng đã chọn của tôi bị bỏ qua. –

15

Đối với bất cứ ai tìm kiếm một giải pháp đầy đủ, tôi đã làm việc này với các mã sau đây dựa trên câu trả lời maximdim của:

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

Đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn – Tomik

+0

Một trong số ít mã ví dụ đã hoạt động cho tôi, cảm ơn! – Cookie

+0

ayone có thể tra cứu câu hỏi của tôi tương tự như thế này không? Http: //stackoverflow.com/questions/14209284/could-not-connect-to-smtp-host-localhost-port-25 –

2

lẽ hữu ích cho bất cứ ai khác chạy vào vấn đề này: Khi thiết lập các cổng trên các thuộc tính:

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

.. đảm bảo sử dụng đối tượng chuỗi. Sử dụng một đối tượng số (tức là Long) sẽ khiến cho câu lệnh này dường như không có hiệu lực.

+0

Cảm ơn! Đó là vấn đề của tôi! – migmig

Các vấn đề liên quan