2012-03-10 25 views
0

私はJavaプログラムからメールを送信する方法を知りたいと思います。私はそれに何も間違ってJavaメールプログラムを書いている。しかし、私はunknow SMTPポート465でも私はgのメールサーバーのポート465を使用しました。 私は知ってほしい任意のオプションは、自分のコンピュータで有効にする必要があります。 私は何が必要なのかを教えてください。 私はWindows 7を使用していて、Gmailサーバーを使いたいと思っています。メールを送信するためにsmtp gmailを使用

あなたの努力は大変感謝しています。

私は以下のエラーを教えてください:

Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465; 
    nested exception is: 
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed 
    at mail1.SendMailSSL.main(SendMailSSL.java:44) 
Caused by: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465; 
    nested exception is: 
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed 
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1706) 
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:525) 
    at javax.mail.Service.connect(Service.java:310) 
    at javax.mail.Service.connect(Service.java:169) 
    at javax.mail.Service.connect(Service.java:118) 
    at javax.mail.Transport.send0(Transport.java:188) 
    at javax.mail.Transport.send(Transport.java:118) 
    at mail1.SendMailSSL.main(SendMailSSL.java:39) 
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1611) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1035) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:124) 
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516) 
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1139) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123) 
    at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:503) 
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:234) 
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1672) 
+0

あなたの家のマシンからこれをやっていますか? ISPによっては、外部のSMTPサーバーへのアクセスをスパム対策としてブロックするものがあります。 –

+0

スタックのトレースをさらに見下ろしてください。エラーはSSLと関係があります。 SSL処理コードを記述しましたか? –

+0

はい私は私の個人的な形をしていますか?私のことを教えてください – BOBBY

答えて

0

接続できるかどうかを確認するには、コマンドtelnet smtp.gmail.com 465を試してみてください。これにより、接続しているかどうかを示すことができます。また、ポート587(Submission/StartTLS)を試してみてください。

Telnetは、Windows 7ではデフォルトでインストールされません。コマンドラインからコマンドpkgmgr /iu:"TelnetClient"を使用してインストールできます。

接続したら、メールを送信するためにgmailのIDとパスワードで認証する必要があります。あなたのコードはまだ接続されていないようです。

0

セッションを取得するときに渡す小道具にdebugオプションを追加して、追加の手がかりを探します。あなたの例外はsend()中で、connect()中ではなく、あなたが使用しているホスト/ポート/ id/pswがすべて正しいと思われるので、あなたは実際にgmailのバックエンドに接続していると思います遅延接続の起こっている)。

props.put("mail.debug", "" + true); // Enable debug mode 
Session session = Session.getInstance(props, new javax.mail.Authenticator() { 
    @Override 
    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication(smtpId, psw); 
    } 
}); 

あなたのデバッグ出力は、次のようになります。

DEBUG SMTP: useEhlo true, useAuth true 
DEBUG SMTP: useEhlo true, useAuth true 
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL true 
9 220 mx.google.com ESMTP cpxgxgxgxgxgxgb.3 
DEBUG SMTP: connected to host "smtp.gmail.com", port: 465 
0

あなたは、このように、のSSLSocketを使用していますか?

SSLSocket s = (SSLSocket) ((SSLSocketFactory) 
          SSLSocketFactory.getDefault()). 
          createSocket(InetAddress.getByName("smtp.gmail.com"), 465); 
3

この解決策は私にとって完璧に機能します。あなたのトラストストアにGmailのSMTPサーバ証明書をインポートする必要があり

  1. 保存出力間の

    "s_client -connect smtp.gmail.com:465" opensslコマンドでGmailのSMTPサーバ証明書を取得します。 "----- BEGIN CERTIFICATE -----"と "----- END CERTIFICATE -----"(その接頭辞/接尾辞を含む)を "gmail.cert"ファイルに追加します

  2. これをインポートします証明書ファイルをキーストアに追加します(Linuxの場合はsudoが必要です)

    keytool -import -alias smtp.gmail.com -keystore「%JAVA_HOME%/ jre/lib/security/cacerts」-file gmail。CERT

  3. が変更に

クレジットを伝播するために、あなたのJavaアプリを再起動し

へ:http://notepad2.blogspot.com/2012/04/import-gmail-certificate-into-java.html

OpenSSLは、ここからダウンロードすることができます:http://gnuwin32.sourceforge.net/packages/openssl.htm

関連する問題