2008-12-22 4 views
18

Tôi đang cố gắng sử dụng Bill the Lizard's code để gửi email bằng Google Apps. Tôi nhận được lỗi này: MãPhải đưa ra lệnh STARTTLS trước. Gửi email bằng Java và Google Apps

Exception in thread "main" javax.mail.SendFailedException: Sending failed; 
    nested exception is: 
    javax.mail.MessagingException: 530 5.7.0 Must issue a STARTTLS command first. f3sm9277120nfh.74 

    at javax.mail.Transport.send0(Transport.java:219) 
    at javax.mail.Transport.send(Transport.java:81) 
    at SendMailUsingAuthentication.postMail(SendMailUsingAuthentication.java:81) 
    at SendMailUsingAuthentication.main(SendMailUsingAuthentication.java:44) 

Bill chứa các dòng tiếp theo, mà dường như có liên quan đến lỗi:

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

Tuy nhiên, nó không giúp đỡ.

Đây là những câu lệnh import tôi:

import java.util.Properties; 
import javax.mail.Authenticator; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

Có ai biết về lỗi này?

Trả lời

4

Tôi nghĩ rằng nó có liên quan đến việc sử dụng SMTPS thay vì SMTP để gửi thư. Đây là một phiên bản khác, được mô hình hóa sau JavaMail FAQ on accessing Gmail. Lưu ý rằng tôi đã bỏ qua tất cả các xử lý ngoại lệ cấp độ tốt hơn để rõ ràng.

private static void send(
     final String username, 
     final String password, 
     final String recipients, 
     final String subject, 
     final String body) 
     throws Exception 
{ 
    final Session session = Session.getInstance(System.getProperties(), null); 
    final Message msg = new MimeMessage(session); 
    final String senderEmail = username.contains("@") ? username : (username + "@gmail.com"); 
    msg.setFrom(new InternetAddress(senderEmail)); 

    final Address[] recipientAddresses = InternetAddress.parse(recipients); 
    msg.setRecipients(Message.RecipientType.TO, recipientAddresses); 

    msg.setSentDate(new Date()); 
    msg.setSubject(subject); 
    msg.setText(body); 

    final Transport transport = session.getTransport("smtps"); 
    transport.connect(GMAIL_SMTP_HOST, GMAIL_SMTP_PORT, username, password); 
    transport.sendMessage(msg, recipientAddresses); 
    transport.close(); 
} 
+0

tôi nhận được n ngoại lệ trong khi chạy mã của bạn: Ngoại lệ trong chuỗi "main" javax.mail.NoSuchProviderException: Không có nhà cung cấp nào cho smtps –

+0

Có vẻ như các tệp tài nguyên JavaMail bị thiếu hoặc bị hỏng (xem http://java.sun.com/products/javamail/ javadocs/javax/mail/Session.html). Có các bản sao mặc định của các tệp bên trong mail.jar/META-INF. –

+0

Cảm ơn, tôi đã làm việc đó. –

16

Tôi đã phát hiện sự cố. Trước đây tôi đã sử dụng j2ee.jar để nhập javax.mail.

Tôi đã xóa j2ee.jar khỏi đường dẫn lớp và tải xuống JavaMail 1.4.1 và đặt vào classpath của tôi hai lọ, smtp.jar và mailapi.jar. Tôi sử dụng tại smtps thay smtp

Transport transport = session.getTransport("smtps");    

Bây giờ Bill mã của Lizard hoạt động.

8

Đây là phiên bản của API thư java. Tôi đang đối mặt với vấn đề này và tôi vừa cập nhật API thư java lên 1.4.3 Nó hoạt động tốt cho tôi!

Cảm ơn!

14

Đặt các thẻ sau. Nó sẽ hoạt động.

props.put("mail.smtp.user","username"); 
props.put("mail.smtp.host", "smtp.gmail.com"); 
props.put("mail.smtp.port", "25"); 
props.put("mail.debug", "true"); 
props.put("mail.smtp.auth", "true"); 
props.put("mail.smtp.starttls.enable","true"); 
props.put("mail.smtp.EnableSSL.enable","true"); 

props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
props.setProperty("mail.smtp.socketFactory.fallback", "false"); 
props.setProperty("mail.smtp.port", "465"); 
props.setProperty("mail.smtp.socketFactory.port", "465"); 
+1

có vẻ hợp lý, nhưng tại sao bạn gây rối với cổng 25?nó chủ yếu luôn bị chặn bởi các ISP và thực sự được đặt lại về 465 vài dòng sau ... –

1

Điều này khiến tôi phát điên và chỉ muốn thêm những gì hiệu quả với tôi. Tôi đã phải cập nhật phiên bản JavaMail (1.4.5) của mình để làm việc này - không chắc chắn phiên bản nào đang được sử dụng trước đây.

Khi tôi được cập nhật lên phiên bản mới của JavaMail, đoạn code sau làm việc cho tôi (có thể bỏ ghi chú dòng debug để lấy thêm thông tin gỡ lỗi - cổng là 587 và chủ nhà là smtp.gmail.com):

public void sendMailWithAuth(String host, String user, String password, 
    String port, List<String> toList, String htmlBody, 
     String subject) throws Exception { 

    Properties props = System.getProperties(); 

    props.put("mail.smtp.user",user); 
    props.put("mail.smtp.password", password); 
    props.put("mail.smtp.host", host); 
    props.put("mail.smtp.port", port); 
    //props.put("mail.debug", "true"); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.starttls.enable","true"); 
    props.put("mail.smtp.EnableSSL.enable","true"); 

    Session session = Session.getInstance(props, null); 
    //session.setDebug(true); 

    MimeMessage message = new MimeMessage(session); 
    message.setFrom(new InternetAddress(user)); 

    // To get the array of addresses 
    for (String to: toList) { 
     message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); 
    } 

    message.setSubject(subject); 
    message.setContent(htmlBody, "text/html"); 

    Transport transport = session.getTransport("smtp"); 
    try { 
     transport.connect(host, user, password); 
     transport.sendMessage(message, message.getAllRecipients()); 
    } finally { 
     transport.close(); 
    } 
}