• 締切済み

[Android+Javamail]送信できません

 こんにちは  Javamailを使ってAndroid用メールアプリの開発を志しているものです。  以下のサイトを参考にさせてもらってコードを作ってエミュレーターで動かしてみました。 http://yamato-iphone.blogspot.jp/2011/12/javamail.html http://d.hatena.ne.jp/ttshrk/20110517/1305641955 http://yaim.blogzine.jp/ability/2012/04/javamail_androi.html  ところが、下記のようなエラーで、メール送信ができませんでした。 12-23 10:56:36.225: W/System.err(541): javax.mail.MessagingException: Could not connect to SMTP host: smtp.hogehoge.jp, port: 587; 12-23 10:56:36.225: W/System.err(541): nested exception is: 12-23 10:56:36.235: W/System.err(541): javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x199c48: Failure in SSL library, usually a protocol error 12-23 10:56:36.235: W/System.err(541): error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x401e0c93:0x00000000)  また、 12-23 10:56:35.385: I/System.out(541): DEBUG: not loading file: /system/lib/javamail.providers 12-23 10:56:35.385: I/System.out(541): DEBUG: java.io.FileNotFoundException: /system/lib/javamail.providers: open failed: ENOENT (No such file or directory)  このようなログも吐き出されており、なにか足りないものがあるようなのですが…  単純なサンプルアプリなどは普通に動作していますので、開発環境にとりあえず不備はないと思います。  Javamail用の3つのファイルもビルドパスに加えてあります。  その他にも追加すべきライブラリがあるのでしょうか?  これだけの情報では、ご回答いただくのは難しいのかも知れませんが…  よろしくお願いいたします。

  • Java
  • 回答数4
  • ありがとう数1

みんなの回答

  • hirotn
  • ベストアンサー率59% (147/246)
回答No.4

・POP3Sのポート番号は確認したほうがよいと思います。(POP3と同じでしょうか?) ・SMTPのプロパティをprops.setPropertyしているように、POPについても同様にsetPropertyする必要があると考えます。 少なくても、Store store = sess.getStore("pop3s"); ならば、 props.setProperty("mail.pop.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); は必要ではないかという認識です。 http://javamail.kenai.com/nonav/javadocs/com/sun/mail/pop3/package-summary.html http://www.igapyon.jp/igapyon/diary/2007/ig070905.html

Seigfried
質問者

補足

 いつもありがとうございます。  私が余計なことを書いたために論点がずれてしまいました。  問題は先に貼り付けたコードで前述のようなエラーが発生しているということです。  POP接続についても、問題は問題ですが、SMTPがSSLで接続できれば自ずと解決するものと思っております。  いろいろなサイトで公開されているコードを参考にさせて頂きましたが、大体これくらいのコードで接続できているということなのですが…  コードを見る限り、SMTP接続についてはいけそうな感じでしょうか?  もしそうなら、なにが原因で接続できないか、思い当たられることはありますでしょうか?  度々恐縮なのですが、よろしくお願いいたします。

  • hirotn
  • ベストアンサー率59% (147/246)
回答No.3

http://siisise.net/java/net/ 仰るとおり、証明書の問題だと思います。 Propertiesクラスの変数に以下の引数を与えてsetPropertyしてください。 ## foo.setProperty("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory"); これでNGでしたら、Propetiesの組立からメール送信の部分を差し支えない範囲で開示いただけると良いかと存じます。

Seigfried
質問者

補足

 再三にわたるご回答誠にありがとうございます。  仰るとおり、最初からソースコードをここに貼り付けるべきでした…  申し訳ございませんでした。  問題のメソッドは以下の通りです。  一部改変しております public void Send_Mail() { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build()); final String mUser = "foo@hogehoge.jp"; final String mpwd = "password"; Properties props = new Properties(); //Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); //上記の一行はエラーになるためコメントアウトしています。 props.setProperty("mail.debug", "true"); props.setProperty("mail.smtp.user", mUser); props.setProperty("mail.smtp.host", "smtp.hogehoge.jp"); props.setProperty("mail.smtp.port", "587"); props.setProperty("mail.smtp.socketFactory.port", "587"); props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.smtp.starttls.enable", "true"); props.setProperty("mail.smtp.ssl.trust", "smtp.hogehoge.jp"); props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.smtp.socketFactory.fallback", "false"); //Session sess = Session.getInstance(props); //上記1行は認証のため下記4行に書き換え Session sess = Session.getInstance(props, new Authenticator(){ protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication( mUser, mpwd ); } }); sess.setDebug(true); try { final MimeMessage mimeMsg = new MimeMessage(sess); //POP Before SMTP Store store = sess.getStore("pop3"); //上記"pop3"を"pop3s"に変えると、証明書が見つからない旨のエラー store.connect("mail.hogehoge.jp", mUser, mpwd ); mimeMsg.setFrom(new InternetAddress(mUser)); mimeMsg.setRecipient(Message.RecipientType.TO, new InternetAddress("foo@hogehoge.jp")); mimeMsg.setContent("body", "text/plain; utf-8"); mimeMsg.setHeader("Content-Transfer-Encoding", "7bit"); mimeMsg.setSubject("テスト送信"); mimeMsg.setText("アンドロイドからの送信", "utf-8"); mimeMsg.setSentDate( new Date() ); //Transport.send(mimeMsg); //上記1行は認証のため下記4行に書き換え Transport transport = sess.getTransport("smtps"); transport.connect("smtp.hogehoge.jp",587,mUser, mpwd); transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());// メール送信 transport.close(); } catch (Exception e) { Log.v("tag",e.getMessage()); e.printStackTrace(); } }  以上です。  いろいろな方のコードを切り貼りさせて貰っております。  大前提として、SSL通信を行う場合には、証明書をインストールする必要があるのでしょうか?  もしそうなら、アンドロイド端末にも、証明書が必要なのでしょうか?  よろしくお願いします。

  • hirotn
  • ベストアンサー率59% (147/246)
回答No.2

javamail.providerによって、プロトコルと、使用するクラスを対応付けしているのでデフォルトであれば、ご自身の環境で適切なクラスを示すことができているかを確認してください。 http://www2s.biglobe.ne.jp/~dat/java/classes/javamail.html --- http://yamato-iphone.blogspot.jp/2011/12/javamail.html 上記URLで示されているところの、 protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(mUser, mPassword); } はされていますか? すなわち、SMTPサーバーに接続する際に、認証が必要ではありませんか? 発生したメソッドを特定したいのでe.getStackTrace()も取得してみますか。

Seigfried
質問者

補足

 ご回答ありがとうございます。  教えて頂いたサイトを参考にして、javamail.providersというファイル作成し、SMTPSSLTransportにかえてみました。  が、 not loading file: /system/lib/javamail.providers  は相変わらずでした…  また、Authenticatorについては、セッションのgetInstanceで実行しています。  使用しているSMTPサーバーは認証が必要です。  ちなみに、POP Before SMTPも必要なので、POP3接続をしています。  POP3sはエラーですが、SSL無しなら問題なく接続できているようです。  SSL接続するために、こちら側にサーバー証明書は必要なのでしょうか?  最後にe.printStackTrace()の結果を一部掲載します。 javax.mail.MessagingException: Could not connect to SMTP host: smtp.hogehoge.jp, port: 587; nested exception is: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x13cbd8: Failure in SSL library, usually a protocol error error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x401e0c93:0x00000000) at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1391) at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:412) at javax.mail.Service.connect(Service.java:288) at jp.hogehoge.mail_service.SendMail.Send_Mail(SendMail.java:93)  最後の行のSend_Mailが自作のメソッドです。  これで分かりますでしょうか?  よろしくお願いします。

  • hirotn
  • ベストアンサー率59% (147/246)
回答No.1

ENOENT は「ファイルがない」ということを表しています。まずはこれを確認して欲しいです。 /system/lib/javamail.providers 例外をcatchして、ログへe.getMessage()することで、詳細を得られないでしょうか…。 import android.util.Log

Seigfried
質問者

補足

 つたない質問にご回答いただきありがとうございます。  さて、 /system/lib/javamail.providers  は、確かに存在していませんでした。  ただ、ログを見ていると、 12-23 14:23:03.403: I/System.out(952): DEBUG: not loading file: /system/lib/javamail.providers 12-23 14:23:03.403: I/System.out(952): DEBUG: java.io.FileNotFoundException: /system/lib/javamail.providers: open failed: ENOENT (No such file or directory) 12-23 14:23:03.413: I/System.out(952): DEBUG: !anyLoaded 12-23 14:23:03.413: I/System.out(952): DEBUG: not loading resource: /META-INF/javamail.providers 12-23 14:23:03.443: I/System.out(952): DEBUG: not loading resource: /META-INF/javamail.default.providers 12-23 14:23:03.443: I/System.out(952): DEBUG: failed to load any providers, using defaults 12-23 14:23:03.443: I/System.out(952): DEBUG: Tables of loaded providers  といったふうに、デフォルトのものを使ってくれているのかな…と考えておりました。  次に、e.getMessage()ですが、 Could not connect to SMTP host: smtp.hogehoge.jp, port: 587  出してくれたログはこれだけでした。  メールソフトでは587ポートで接続しているので、サーバー側の問題ではないと思っています。  このような感じなのですが、いかがでしょうか?

関連するQ&A

  • javamailで送信エラー?

    お世話になります、javaMailにてメール送信システムを 構築したのですが、以下のエラーが出てしまって送信できません Sending failed;nested exception is: javax.mail.SendFailedException: InvalidAddresses; nested exception is: javax.mail.SendFailedException: 550Relay restricted SMTPHOST名やメールアドレスが違う等のエラーとは違っていると思うのですが(550Relay restrictedのあたりが) どのような現象なのでしょうか? お知恵をお貸しください。 宜しくお願いします。

  • Javamailで困っています。

    開発環境(Eclipse+tomcat)でJavamailが正常に実行出来、メールが送れるのですが、 実行環境(tomcat7を使用してのWebアプリケーション上)ではmailが送れないです。 【バージョン】 tomcat7 mail1.4.4 jdk1.7 Windows7(開発環境、実行環境共に) 【エラー内容】 javax.mail.MessagingException: Could not connect to SMTP host: smtp.xxx.co.jp, port: 25; nested exception is: java.net.SocketException: Permission denied: connect at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1934) at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:638) at javax.mail.Service.connect(Service.java:317) at javax.mail.Service.connect(Service.java:176) at javax.mail.Service.connect(Service.java:125) at javax.mail.Transport.send0(Transport.java:194) at javax.mail.Transport.send(Transport.java:124) OracleのページでJDK7の場合はIPv4を使う様にすると書いてあったので、 tomcat起動時にjavaオプションを追加していますが、それでもmailが送れません。 -Djava.net.preferIPv4Stack=true 参考URL:http://www.oracle.com/technetwork/java/javamail/faq-135477.html#ipv6perm 開発環境では問題ないので、ソースに不備はないと考えているのですが、 どなたか同じ様なケースになって解決された方いませんでしょうか? ご教授宜しくお願い致します。

  • JavaMail smtp.mail.yahoo.co.jp

    お世話になります。 JavaMail1.4を用いて、 自作プログラム内でメール送信を行おうとしているのですが、 エラーが返ってきてしまいます。 以下エラー内容です。 DEBUG SMTP: useEhlo true, useAuth true DEBUG SMTP: trying to connect to host "smtp.mail.yahoo.co.jp", port 25, isSSL false javax.mail.MessagingException: Could not connect to SMTP host: smtp.mail.yahoo.co.jp, port: 25; nested exception is: java.net.ConnectException: Connection timed out: connect at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1227) at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:322) at javax.mail.Service.connect(Service.java:258) at javax.mail.Service.connect(Service.java:137) at javax.mail.Service.connect(Service.java:86) at javax.mail.Transport.send0(Transport.java:150) at javax.mail.Transport.send(Transport.java:80) at partsPackage.MailTransfer.send(MailTransfer.java:135) at partsPackage.Tester.main(Tester.java:14) 設定が悪いのか、 サーバーの指定等が悪いのか検討が付かない状況です。 ソースは final String username = "○○○○"; final String password = "○○○○"; final String from_name = "○○○○"; final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory"; Session session = null; MimeMessage mimeMessage = null; String charset = "UTF8"; String sendTo = null; String title = null; String contents = null; public MailTransfer(){} public MailTransfer(String charset){this.charset=charset;} boolean isConnected(){return session!=null;} public boolean hasMessage(){return mimeMessage!=null;} public boolean hasDestination(){return sendTo!=null;} public boolean hasTitle(){return title!=null;} public boolean hasText(){return contents!=null;} void connect(){ Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); Properties props = System.getProperties(); props.setProperty("mail.smtp.host", "smtp.mail.yahoo.co.jp"); props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY); props.setProperty("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.port", "25"); props.setProperty("mail.smtp.socketFactory.port", "25"); props.put("mail.smtp.auth", "true"); props.put("mail.debug", "true"); session = Session.getInstance(props, new Authenticator(){ protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); } public void create_mail(){ System.out.println("送信メール作成"); if(!isConnected())connect(); if(hasMessage())return; mimeMessage=new MimeMessage(session); try { // 送信元メールアドレスと送信者名を指定 mimeMessage.setFrom(new InternetAddress(username+"@yahoo.co.jp",from_name,charset)); // メールの形式を指定 mimeMessage.setHeader("Content-Type","text/html"); } catch (Exception e) { e.printStackTrace(); } System.out.println("送信メール作成完了"); } よろしくお願い致します。

  • JavaMailでのメール送信

    JavaMail でメールを送信しようとしていますが、うまく送信できません。 SMTPサーバはユーザ認証とPOP before SMTP です。 コードの一部を抜粋しますと Session session = Session.getDefaultInstance(props, null); Store store = session.getStore("pop3"); store.connect(host, user, pass); MimeMessage message = new MimeMessage(session); --途中省略-- Transport transport = session.getTransport("smtp"); transport.connect(null, user, pass); transport.sendMessage(message, message.getAllRecipients()); となっています。一番下の行で以下のエラーが出ます。 javax.mail.MessagingException: Could not connect to SMTP host: ***.***.***.***, port: 25; nested exception is: java.net.SocketException: Software caused connection abort: connect at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1213) at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:311) at javax.mail.Service.connect(Service.java:233) at javax.mail.Service.connect(Service.java:134) at SendMail.sendMessage(SendMail.java:346) at SendMail.main(SendMail.java:162) Java初心者ですが、どうかよろしくお願いいたします。

  • javamailでメール送信ができません

    javamailでメールを送信しようとすると エラーが表示されます。 コードとエラー内容http://okwave.jp/qa/q6678667.html いったい何が原因なのかさっぱりわかりません パソコンのセキュリティソフトはすべて削除しましたし ファイアーウォールも無効にしています。

    • ベストアンサー
    • Java
  • JavaMailを使う前のTomcatの設定

    JavaMailでメールを送信するプログラムを作成しております。 バージョンは Tomcat5.5.33 JDK6.0_35 です。 いろいろ調べていると、JavaMailのAPIが必要という事がわかり、次のURLから http://www.oracle.com/technetwork/java/javamail/index.html javax.mail.jarとactivation.jarをダウンロードして TomcatのWEB-INF/libにコピーしました。 この設定で間違いはないでしょうか? まだメール送信はできておりません。 素人な質問で申し訳ありません。 どなたか、ご教授願います。

  • javamailを使ってのメール送信。

    james-2.0a3、javamail-1.2、pop3-1.1.1をインストールした後に環境変数もセットしました。ここでjavamailの参考サイト(http://www.showa-cats.com/technical/Java/javamail/index.htm)のサンプルプログラムを試しに実行しようとしたところ下記に示すエラーが出ました。windows2000Professional, j2sdk1.4.0_01, Tomcat3.3.1 サーブレット実行後のエラー 『Error: 500  場所: /netjv/servlet/MsgSend  内部のサーブレットのエラー:  java.lang.NoClassDefFoundError: javax/mail/Message       at MsgSend.doPost(msgsend.java:37)・・略』 tomcatコマンドプロンプトより 『2003-02-05 10:23:59 - Ctx(/netjv) : Exception in R( /netjv        + /servlet/MsgSend +   null) - java.lang.NoClassDefFoundError: javax/mail/Message at MsgSend.doPost(msgsend.java:37)・・略』 MsgSend.javaのソースより  『37:PrintWriter pw = response.getWriter();   38:try {   39://MsgSendBeansのインスタンスを取得   40:MsgSendBeans msb = new MsgSendBeans();』 37行目のMsgSendBeans.javaのインスタンスの取得がうまくいってないと思うのですが、どうしたらよいかがわかりません。どなたかよろしくお願いします。

  • 送信のみできません。

    windows live メールで送信のみができまなくなりました。 エラーは次の通りです。  原因、解決方法がわかれば教えてください。 不明なエラーが発生しました。 サーバー: '×××.or.jp' Windows Live メール エラー ID: 0x80070057 プロトコル: SMTP ポート: 587 セキュリティ (SSL): いいえ

  • メールの送信のみできません・・・

    どうぞよろしくお願いいたします。 急にメールの送信のみ出来なくなりました。 ■環境:VISTA ・ WINDOWS LIVE MAIL ■エラーメッセージ: > サーバーに接続しようとしているときに TCP/IP エラーが発生しました。 > > 件名 '【///////////////////////////////////】' > サーバー: 'mail.●●●.jp' ←●●はドメインです。 > Windows Live メール エラー ID: 0x800CCC15 > プロトコル: SMTP > ポート: 587 > セキュリティ (SSL): いいえ ■セキュリティソフト:ウィルスバスター2008 ウィルスソフトを外すと、エラーメッセージは下記になります。 サーバー: 'mail.●●●.jp' Windows Live メール エラー ID: 0x800CCC0E プロトコル: SMTP ポート: 587 セキュリティ (SSL): いいえ ソケット エラー: 10061 仕事で使用しているので、困っております。 アドバイスいただけましたら幸いです。 どうぞよろしくお願いいたします。

  • javamailのインポートでエラー

    開発環境はeclipseを使用していますが、 import javax.mailでエラーが発生しています。 javamailは、「ウィンドウ」の「設定」の「java」の 「ビルドパス」の「クラスパス変数」にmail.jarを設定しています。 ご教授お願いします。

専門家に質問してみよう