質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

0回答

5444閲覧

servletからjavax.mailを使ってgmailにメールを送りたい

takanori222

総合スコア7

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

1グッド

0クリップ

投稿2016/10/25 09:45

編集2016/10/26 02:53

###【自己解決しました】servletからjavax.mailを使ってgmailにメールを送りたい
現在、javax.mailの仕組みを利用してgmailに対してメールを送信する仕組みを構築しています。
mainメソッドからはメールが送信できることを確認しましたが、この仕組みをWebSphereServerに持って行ったところ、
下記のエラーが発生しました。

###発生している問題・エラーメッセージ

[ERROR ] CWPKI0022E: SSL ハンドシェークの失敗: SubjectDN CN=smtp.gmail.com, O=Google Inc, L=Mountain View, ST=California, C=US の署名者がターゲット・ホストから送信されました。 SSL 構成別名 defaultSSLConfig にあるローカル・トラストストア /Users/xxxx/wlp/usr/servers/xxxxx/resources/security/key.jks にこの署名者を追加する必要がある可能性があります。 SSL ハンドシェーク例外から送られた拡張エラー・メッセージは次のとおりです: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target [err] javax.mail.MessagingException: Could not convert socket to TLS; nested exception is: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target [err] at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1907)

###該当のソースコード

Java

1package com.xxxxx.module.mail; 2 3import java.io.IOException; 4import java.net.InetAddress; 5import java.net.Socket; 6import java.security.cert.X509Certificate; 7 8import javax.net.SocketFactory; 9import javax.net.ssl.SSLContext; 10import javax.net.ssl.SSLSocketFactory; 11import javax.net.ssl.TrustManager; 12import javax.net.ssl.X509TrustManager; 13 14/** 15 * DummySSLSocketFactory 16 */ 17public class DummySSLSocketFactory extends SSLSocketFactory { 18 private SSLSocketFactory factory; 19 20 public DummySSLSocketFactory() { 21 try { 22 SSLContext sslcontext = SSLContext.getInstance("TLS"); 23 sslcontext.init(null, new TrustManager[] { new X509TrustManager() { 24 public void checkClientTrusted(X509Certificate[] cert, String authType) { 25 // everything is trusted 26 } 27 28 public void checkServerTrusted(X509Certificate[] cert, String authType) { 29 // everything is trusted 30 } 31 32 public X509Certificate[] getAcceptedIssuers() { 33 return new X509Certificate[0]; 34 } 35 } }, null); 36 factory = (SSLSocketFactory) sslcontext.getSocketFactory(); 37 } catch (Exception ex) { 38 // ignore 39 } 40 } 41 42 public static SocketFactory getDefault() { 43 return new DummySSLSocketFactory(); 44 } 45 46 public Socket createSocket() throws IOException { 47 return factory.createSocket(); 48 } 49 50 public Socket createSocket(Socket socket, String s, int i, boolean flag) throws IOException { 51 return factory.createSocket(socket, s, i, flag); 52 } 53 54 public Socket createSocket(InetAddress inaddr, int i, InetAddress inaddr1, int j) throws IOException { 55 return factory.createSocket(inaddr, i, inaddr1, j); 56 } 57 58 public Socket createSocket(InetAddress inaddr, int i) throws IOException { 59 return factory.createSocket(inaddr, i); 60 } 61 62 public Socket createSocket(String s, int i, InetAddress inaddr, int j) throws IOException { 63 return factory.createSocket(s, i, inaddr, j); 64 } 65 66 public Socket createSocket(String s, int i) throws IOException { 67 return factory.createSocket(s, i); 68 } 69 70 public String[] getDefaultCipherSuites() { 71 return factory.getDefaultCipherSuites(); 72 } 73 74 public String[] getSupportedCipherSuites() { 75 return factory.getSupportedCipherSuites(); 76 } 77}

###試したこと
問題点は、SSLが秘密鍵を求めていることでした。
SSLはTrustManagerというクラスの中で秘密鍵を求めています。
そこで上記のダミーのSSLSocketFactoryを用意し、TrustManagerを求められる場所でX509TrustManagerインターフェイスをimplementした匿名クラスを作成し、そこで各メソッドをoverrideして秘密鍵を求めないように変更しました。

java

1 Properties props = new Properties(); 2 props.put("mail.smtp.host", "smtp.gmail.com"); 3 props.put("mail.smtp.socketFactory.port", "587"); 4// props.put("mail.smtp.socketFactory.class", "javax.net.SocketFactory"); 5 props.put("mail.smtp.ssl.socketFactory.class","com.xxxxx.module.mail.DummySSLSocketFactory"); 6 7 props.put("mail.smtp.auth", "true"); 8 props.put("mail.smtp.port", "587"); 9 props.put("mail.smtp.ssl.enable", "false"); 10 props.put("mail.smtp.starttls.enable", "true"); 11 props.put("mail.smtp.ssl.trust", "smtp.gmail.com"); 12

結果、秘密鍵を求められることなくgmailでの送信が可能になりました。
ご協力ありがとうございました。

###補足情報(言語/FW/ツール等のバージョンなど)
・MacOS
・Java8
・製品名: WebSphere Application Server 製品バージョン: 16.0.0.3

akio221👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akio221

2016/10/25 10:56

まず、例外メッセージをよく読み、SunCertPathBuilderExceptionで検索してみてはいかがですか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問