2012-10-15 27 views
17

Tôi gặp sự cố khi tải ứng dụng để sử dụng API JavaMail để gửi một số tệp theo cách tự động hơn chúng ta thường làm. Tôi rất mới với Java và NetBeans, nhưng đã được lập trình bằng các ngôn ngữ khác, vì vậy hãy tha thứ cho tôi nếu tôi có vẻ hơi mất Java hoặc NetBeans.API JavaMail tới iMail - java.net.SocketException: Quyền bị từ chối: kết nối

tôi tiếp tục nhận được lỗi này

java.net.SocketException: Permission denied: kết nối

khi cố gắng kết nối với mail server địa phương. Tôi đã kết nối và gửi thư thành công thông qua máy chủ SMTP của gmail với cùng mã, chỉ cần thay đổi tên người dùng, mật khẩu và cổng. Tôi cũng có thể telnet đến máy chủ của chúng tôi thành công và nhận được một phản ứng 220 từ cổng 25. Tôi cũng có một tập tin thực thi chạy và nó gửi thành công e-mail thông qua máy chủ cục bộ của chúng tôi. Bất kỳ suy nghĩ hoặc ý tưởng nào về lý do tại sao tôi không thể kết nối thông qua JavaMail?

Đây là mã gửi e-mail.

Source code:

public void sendEmail(String customerNumber, ArrayList fileList){ 
    String from = "xxxx"; 
    String username = "xxxx"; 
    String to = "xxxx"; 
    String host = "10.1.1.6"; 
    String pwd = "xxxx"; 
    String port = "25"; 

    Properties props = System.getProperties(); 
    props.put("mail.smtp.host", host); 
    props.put("mail.smtp.port", port); 
    props.put("mail.smtp.user", username); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.starttls.enable", "true"); 
    props.put("mail.smtp.debug", "true"); 
    props.put("mail.smtp.socketFactory.port", port); 
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 

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

    MimeMessage message = new MimeMessage(session); 
    try{ 
     message.setFrom(new InternetAddress(from)); 
     message.setRecipients(Message.RecipientType.TO, to); 
     message.setSubject("Electronic Invoices"); 
     BodyPart messageBodyPart = new MimeBodyPart(); 
     messageBodyPart.setText("Electronic Invoices"); 
     Multipart multipart = new MimeMultipart(); 
     multipart.addBodyPart(messageBodyPart); 
     for(int i = 0; i < fileList.size(); i++){ 
      messageBodyPart = new MimeBodyPart(); 
      String fileName = (String) fileList.get(i); 
      DataSource source = new FileDataSource(fileName); 
      messageBodyPart.setDataHandler(new DataHandler(source)); 
      messageBodyPart.setFileName(fileName); 
      multipart.addBodyPart(messageBodyPart); 
     } 
     message.setContent(multipart); 

     Transport tr; 
     tr = session.getTransport("smtp"); 
     tr.connect(host, username, pwd); 
     tr.sendMessage(message, message.getAllRecipients()); 
     jTextArea2.append("Mail Sent Successfully"); 
     tr.close(); 

    } catch(Exception e){ 
     jTextArea2.append("sendEmail()::" + System.getProperty("line.separator") + e + System.getProperty("line.separator")); 
     System.out.println(e.getMessage()); 
     System.out.println(e.getCause()); 
    } 
} 

Output từ hai câu lệnh Ngoại lệ:

DEBUG: setDebug: JavaMail version 1.4.5 
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc] 
DEBUG SMTP: useEhlo true, useAuth true 
DEBUG SMTP: trying to connect to host "10.1.1.6", port 25, isSSL false 
Could not connect to SMTP host: 10.1.1.6, port: 25 
java.net.SocketException: Permission denied: connect 
+0

JDK 7? Kiểm tra anh chàng này http://stackoverflow.com/a/7478027/643500 –

+0

Tôi đã thêm tệp -Djava.net.preferIPv4Stack = true vào tệp cấu hình NetBeans của mình, nhưng tôi vẫn gặp lỗi. Nó vẫn cho phép tôi gửi từ một tài khoản gmail mặc dù. Cảm ơn bạn đã phản hồi nhanh. – John

+1

Điều đó nên đi đến các tùy chọn VM. Một cách khác để xác nhận nếu nó là cùng một vấn đề, trong Netbeans, nhấp chuột phải vào project> properties> Libraries và chọn một JDK 6 Java Platform (cài đặt nếu bạn không có nó). Làm sạch, xây dựng rồi thử lại. Điều này sẽ loại bỏ vấn đề này là vấn đề. –

Trả lời

18

Thêm -Djava.net.preferIPv4Stack=true với các tùy chọn VM. Một cách khác để xác nhận nếu nó là cùng một vấn đề, trong Netbeans, nhấp chuột phải vào project> properties> Libraries và chọn một JDK 6 Java Platform (cài đặt nếu bạn không có nó). Làm sạch, xây dựng rồi thử lại. Điều này sẽ loại bỏ vấn đề này là vấn đề

Credit https://stackoverflow.com/a/7478027/643500

1

Trong trường hợp để đơn giản hóa ứng dụng gọi (ví dụ từ CLI) sử dụng trong mã lúc khởi động:

System.setProperty("java.net.preferIPv4Stack", "true")

giả rằng ứng dụng sẽ làm việc với ngăn xếp mạng IPv4 cũ.

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