web-dev-qa-db-ja.com

javax.mail.NoSuchProviderException:smtpsのプロバイダーがありません

私はJavaプロジェクトをセットアップして電子メールを送信できるように(問題がある場合は、Gメールを介して)、「javax.mail.NoSuchProviderException:No provider for smtps "次の行を実行しようとするたびに(これは、例からのコピー/貼り付けです)。

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

調べてみたところ、クラスパスにmail.jarが含まれていないため、通常はスローされますが、実際にはmail.jarが含まれています。 JDK 1.6を実行しているので、FAQ here( http://www.Oracle.com/technetwork/Java/javamail /faq-135477.html#classpath )。さらに、javamailのバージョン1.4.7には、activation.jarが存在しないようです。

何かが破損した場合に備えて、OracleのWebサイトからZip全体を再度ダウンロードし、それを抽出して、新しいjarを追加しました(古いjarを削除した後)、それでも同じエラーが発生します。この時点で問題が何であるかについての考えはありますか?

編集:印刷されている完全なスタックトレースは次のとおりです。

javax.mail.NoSuchProviderException: No provider for smtps
    at javax.mail.Session.getProvider(Session.Java:433)
    at javax.mail.Session.getTransport(Session.Java:627)
    at javax.mail.Session.getTransport(Session.Java:608)
... my code that calls getTransport() ...
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
    at Java.lang.reflect.Method.invoke(Method.Java:597)
... more of my code ...
    at Java.lang.Thread.run(Thread.Java:662)
9
JuniorIncanter

そのため、私が参照していたプロジェクトに古いバージョンのmail.jarが含まれていたことが問題であり、mail.jarのコピーを更新すると問題が解決したことがわかりました。

今後の参考のために、このようなjarの競合をログに記録したり、可視性を提供したりする方法はありますか?

https://confluence.atlassian.com/confkb/cannot-send-email-due-to-javax-mail-nosuchproviderexception-smtp-error-154079.html

7
JuniorIncanter

誰かが私と同じ過ちを犯した場合に備えて:小文字を使用する必要がありますプロトコル解決が機能するために。プロトコル名としてSMTPの代わりにsmtpと入力すると、NoSuchProviderExceptionが表示されます。他のすべてのプロバイダーでも同じように機能します。

5
Dariusz

Mail APIを使用するときは、どのプロトコルを使用することを期待しているのかを確認してください。この場合、Eclipseプロジェクトにsmtp.jarがありません。

メールAPIで使用できるさまざまなプロトコルのjarがいくつかあります。 EX:dsn.jar、gimap.jar、imap.jar、mailapi.jar、pop3.jar、smtp.jar

4
nimesh makwana

ビルドパスにjavax.mail.jarがあることを確認してください。 Eclipseを使用している場合は、ファイルエクスプローラーでプロジェクトを更新するか右クリックして、ビルドパスの構成を選択し、外部JARを追加してから、ビルドパスに追加する必要があります。 Javaを使用してメールを送信する は、自分のコードを確認したい場合に備えて、動作するコードを提供します(私はテストしました)。それが問題でない場合、またはEclipseを使用していない場合は、スタックトレースが適切です。

4
Keith Aylwin

JavaMailは、プロトコルプロバイダーを構成する構成ファイルをClassLoaderに要求します。 ClassLoaderが正しく機能しない場合、JavaMailは構成ファイルを見つけることができません。 OSGi ClassLoaderの動作方法とJavaMailが期待する動作の間に互換性がないため、この問題が発生する可能性があります。 Eclipse自体でアプリケーションを実行している場合、それがこの問題を説明している可能性があります。この問題のもう1つの一般的な原因は、クラスファイルがjarファイルから抽出されてアプリケーションに含まれるが、構成ファイルが残されるような方法でmail.jarファイルをプロジェクトにインポートすることです。

「Java」コマンドを使用して、CLASSPATHにmail.jarファイルを指定し、コマンドラインからプログラムを実行してみてください。

1
Bill Shannon

私と同じような問題を持つ他の人のために。

必ず設定してください

 properties.put("mail.transport.protocol", "smtp"));

の代わりに

 properties.put("mail.transport.protocol", "SMTP"));
0
virtuvious

同じ問題が発生しました。 mavenに正しい依存関係を追加することで解決しました。グループID-javax.mailアーティファクト-メールバージョン1.4.7

mavenビルドなしで実行している場合は、javax.mailの正しいライブラリを追加します

0
Siva Pandian

Tomcatのlibディレクトリにmail.jarとactivation.jarがあり、アプリケーションのlibディレクトリにmailapi.jarがありました。 mailapi.jarはメールAPIの軽量バージョンであり、アプリケーションがsmtp例外をスローした理由smtp.jarが必要であるため、アプリケーションは実行時にmailapi.jarを読み取っていました。したがって、この例外を取り除きたい場合は、

Mail.jarとmailapi.jarの間の競合を次の方法で解決してください:

  • Mailapi.jarを削除します(クラスパスにある場合)。
  • または、クラスパスにmailapi.jarとsmtp.jarの1つのペアを保持して削除します
    mail.jar。
  • または、クラスパスにmail.jarとactivation.jarの1つのペアを保持するだけです(クリーンなアプローチ)。

(参考:メール関連のjarファイルを見つけるためにファイルシステムを検索し、次のパス(クラスパスのgradleによって追加された)C:\ workspace.metadata.plugins\org.Eclipse.wstに競合するjarファイルがあることを知りました。 server.core\tmp0\wtpwebapps\testapp\WEB-INF\lib)

0
Sumit Sundriyal