私は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)
そのため、私が参照していたプロジェクトに古いバージョンのmail.jarが含まれていたことが問題であり、mail.jarのコピーを更新すると問題が解決したことがわかりました。
今後の参考のために、このようなjarの競合をログに記録したり、可視性を提供したりする方法はありますか?
誰かが私と同じ過ちを犯した場合に備えて:小文字を使用する必要がありますプロトコル解決が機能するために。プロトコル名としてSMTP
の代わりにsmtp
と入力すると、NoSuchProviderException
が表示されます。他のすべてのプロバイダーでも同じように機能します。
Mail APIを使用するときは、どのプロトコルを使用することを期待しているのかを確認してください。この場合、Eclipseプロジェクトにsmtp.jarがありません。
メールAPIで使用できるさまざまなプロトコルのjarがいくつかあります。 EX:dsn.jar、gimap.jar、imap.jar、mailapi.jar、pop3.jar、smtp.jar
ビルドパスにjavax.mail.jarがあることを確認してください。 Eclipseを使用している場合は、ファイルエクスプローラーでプロジェクトを更新するか右クリックして、ビルドパスの構成を選択し、外部JARを追加してから、ビルドパスに追加する必要があります。 Javaを使用してメールを送信する は、自分のコードを確認したい場合に備えて、動作するコードを提供します(私はテストしました)。それが問題でない場合、またはEclipseを使用していない場合は、スタックトレースが適切です。
JavaMailは、プロトコルプロバイダーを構成する構成ファイルをClassLoaderに要求します。 ClassLoaderが正しく機能しない場合、JavaMailは構成ファイルを見つけることができません。 OSGi ClassLoaderの動作方法とJavaMailが期待する動作の間に互換性がないため、この問題が発生する可能性があります。 Eclipse自体でアプリケーションを実行している場合、それがこの問題を説明している可能性があります。この問題のもう1つの一般的な原因は、クラスファイルがjarファイルから抽出されてアプリケーションに含まれるが、構成ファイルが残されるような方法でmail.jarファイルをプロジェクトにインポートすることです。
「Java」コマンドを使用して、CLASSPATHにmail.jarファイルを指定し、コマンドラインからプログラムを実行してみてください。
私と同じような問題を持つ他の人のために。
必ず設定してください
properties.put("mail.transport.protocol", "smtp"));
の代わりに
properties.put("mail.transport.protocol", "SMTP"));
同じ問題が発生しました。 mavenに正しい依存関係を追加することで解決しました。グループID-javax.mailアーティファクト-メールバージョン1.4.7
mavenビルドなしで実行している場合は、javax.mailの正しいライブラリを追加します
Tomcatのlibディレクトリにmail.jarとactivation.jarがあり、アプリケーションのlibディレクトリにmailapi.jarがありました。 mailapi.jarはメールAPIの軽量バージョンであり、アプリケーションがsmtp例外をスローした理由smtp.jarが必要であるため、アプリケーションは実行時にmailapi.jarを読み取っていました。したがって、この例外を取り除きたい場合は、
Mail.jarとmailapi.jarの間の競合を次の方法で解決してください:
(参考:メール関連のjarファイルを見つけるためにファイルシステムを検索し、次のパス(クラスパスのgradleによって追加された)C:\ workspace.metadata.plugins\org.Eclipse.wstに競合するjarファイルがあることを知りました。 server.core\tmp0\wtpwebapps\testapp\WEB-INF\lib)