web-dev-qa-db-ja.com

JavaMail API to iMail-Java.net.SocketException:Permission denied:connect

アプリケーションがJavaMail APIを使用して、以前よりも自動化された方法でいくつかのファイルを送信するのに問題があります。私はJavaとNetBeansが初めてですが、他の言語でプログラミングしているので、JavaおよびまたはNetBeans.

このエラーが発生し続けます

Java.net.SocketException:許可が拒否されました:接続

ローカルメールサーバーに接続しようとしたとき。ユーザー名、パスワード、ポートを変更するだけで、同じコードを使用してGmailのSMTPサーバーを介してメールを正常に接続して送信しました。また、サーバーにtelnetで接続し、ポート25から220の応答を受け取ることができました。また、実行するバッチファイルがあり、ローカルサーバー経由で電子メールを正常に送信します。 JavaMailを介して接続できない理由についての考えやアイデアはありますか?

電子メールを送信するコードは次のとおりです。

ソースコード:

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

2つの例外ステートメントからの出力:

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
20
John

追加 -Djava.net.preferIPv4Stack=trueにVMオプション。同じ問題であるかどうかを確認する別の方法。Netbeansで、プロジェクト>プロパティ>ライブラリを右クリックし、JDK 6 Javaプラットフォーム(インストールしていない場合はインストールします)クリーンアップ、ビルドしてから再試行します。これにより、この問題が問題として解消されます。

クレジット https://stackoverflow.com/a/7478027/6435

20

開始時のコードで使用されるアプリ呼び出し(CLIなどから)を簡素化する場合:

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

アプリがレガシーIPv4ネットワークスタックで動作すると仮定します。

1
Ruslan