gmail 受信したメール本文のテキスト内容を取得したい

3,162 views
Skip to first unread message

omimat...@gmail.com

unread,
Jul 23, 2013, 4:42:09 AM7/23/13
to android-g...@googlegroups.com
はじめまして omimatsu4403と申します。

VBやCを主にプログラムしておりましてJAVA元年の初心者です。
オブジェクトタイプにまだアレルギーがあるひよっこです。
現在アプリの開発をしておりましてテキストを一通り行い、Gmailを使用した
アプリを作成しようと思ってますがGmailのソース自体がオープンではなく
フリーのK-9mailのソースを見ても複雑すぎて難航しております。

もしアドバイスいただけるようでしたらお願いいたしますm(_ _)m


・アプリ開発端末:206SH android4.2.2

・Gmailを受信時に受信メールの本文をせめてLogに出すだけの
 単純なサンプル、解説のあるWeb、サンプルなどあれば助かります。

 受信時のintentでGmailが受け取りの判定までは何とかクリアしました。

以上、よろしくお願いいたします。

Sosuke Masui

unread,
Jul 23, 2013, 5:14:17 AM7/23/13
to android-g...@googlegroups.com
Gmailアプリケーションが端末に保存したメールは、他のアプリからは読めません。
K-9 MailなどのGmailを読めるアプリケーションはIMAP経由でGmailのサーバーにアクセスしてメール本文を読み取っています。

Gmail, IMAP, JavaMail あたりのキーワードで検索すれば数十行程度のサンプルが見つかります。

また、GmailのIMAPアクセスはデフォルト無効なので、あなた、及びあなたのアプリケーションのユーザーはGmailの設定でIMAPアクセスを有効にする必要があります。


2013年7月23日火曜日 17時42分09秒 UTC+9 omimat...@gmail.com:

omimat...@gmail.com

unread,
Jul 23, 2013, 8:26:52 PM7/23/13
to android-g...@googlegroups.com
Sosuke Masuiさん、

早速の回答ありがとうございます。
下記内容確認してみます。



2013年7月23日火曜日 18時14分17秒 UTC+9 Sosuke Masui:

omimat...@gmail.com

unread,
Oct 20, 2013, 9:33:13 PM10/20/13
to android-g...@googlegroups.com
お世話になります。

だいぶ間が開きましたが自分なりに確認してサンプルを
作ってみました。一応JAVAを使用してPCでは受信INBOXを
取り出すことには成功しました。

現在Session部分でプログラムが終了するのですが原因がわかりません。
どうかアドバイスありましたらお願いいたします。

①ログに以下のメッセージが出ています。
  VFY: unable to resolve static method 4829: Ljavax/mail/Session;
  .getDefaultInstance (Ljava/util/Properties;Ljavax/mail/Authenticator;)
  Ljavax/mail/Session;

②以下パーミッション設定です。
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.gm.permission.READ_GMAIL" />
    <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="com.google.android.providers.gmail.permission.READ_GMAIL" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
③ライブラリーは可能性あるのをとにかく入れて試してみました。
    mail.jar
    activation.jar
    additionnal.jar
    gimap.jar
    imap.jar
    mailapi.jar
    pop3.jar
    dsn.jar
    
④PGM本文です。getDefaultInstanceがエクリプス上で斜文字になっていますが
何か関係があるでしょうか?
// プロパティを取得 
Properties props = System.getProperties(); 

// プロパティに設定を追加 
props.setProperty("mail.imap.socketFactory.class","javax.net.ssl.SSLSocketFactory"); 
props.setProperty("mail.imap.socketFactory.fallback", "false"); 
props.setProperty("mail.imap.socketFactory.port", "993"); 
props.setProperty("mail.imap.port", "993"); 

// セッションを取得 
Session session = Session.getDefaultInstance(props, null);

以上です。JAVA初心者でつたないところ多々あると思いますがよろしくお願いいたします。


Hidetaka Kawase

unread,
Oct 20, 2013, 10:09:40 PM10/20/13
to android-g...@googlegroups.com
Kawaseです。

現在はContentProviderが提供されているので、GmailContractで読めます。

可能ならばContentProviderで解決するのが最もスマートかつ
セキュリティ上も安全かと思います。

以下は、どうしてもJavaMailAPIで解決する必要がある場合のみ。

①ログに以下のメッセージが出ています。

Androidフレームワークにはjavax.mailパッケージはありませんので、
追加するJARが不足していると思われます。
示されているクラスはmail.jarに入っているはずですが、/libsを確認してみて下さい。

ただ、JAR不足が原因と断定するにはログが不十分なので
問題箇所周辺のログを隠匿すべき情報を除いてなるべく多く
掲載していただくのが解決への近道かと思います。

④PGM本文です。getDefaultInstanceがエクリプス上で斜文字になっていますが
何か関係があるでしょうか?

斜体になるのは、デフォルトの表示設定だと
staticメンバを分かりやすいように表示してくれているものです。
実装内容とは特に関連ありません。

// プロパティを取得
Properties props = System.getProperties();

システムプロパティである必要はないので、
Properties props = new Properties(); でOKだと思います。

// セッションを取得
Session session = Session.getDefaultInstance(props, null);

引数1つの方を呼び出すとどうなりますか?

以上

2013年10月21日月曜日 10時33分13秒 UTC+9 omimat...@gmail.com:

omimat...@gmail.com

unread,
Oct 20, 2013, 10:43:46 PM10/20/13
to android-g...@googlegroups.com
Kawaseさん、

早速のアドバイスありがとうございます。
ContentProviderもサンプルがあるようなので試してみたいと思います。

以下ログのその他原因と見られる箇所で明らかにClassがないと言われてました。
すみません、ここが重要でした。JAVAでは動作してたと思うのですが…
javax.mail.Sessionを含むjarが必要ということでしょうか?

10-21 11:24:19.524: W/dalvikvm(22256): threadid=1: thread exiting with uncaught exception (group=0x413d3ac8)
10-21 11:24:19.584: E/AndroidRuntime(22256): FATAL EXCEPTION: main
10-21 11:24:19.584: E/AndroidRuntime(22256): java.lang.NoClassDefFoundError: javax.mail.Session

omimat...@gmail.com

unread,
Oct 21, 2013, 8:50:18 PM10/21/13
to android-g...@googlegroups.com
Session 抜けました。

jarファイルに余計なファイルをつけすぎてSessionが有効になってなかったみたいです。
引き続きデバッグしてみます。

Hidetaka Kawase

unread,
Oct 21, 2013, 10:21:08 PM10/21/13
to android-g...@googlegroups.com
Kawaseです。

ひとまず進んでいらっしゃるようで良かったです。

挙げられていたJARのパッケージ構成確認しましたが
javax.mail.Sessionと衝突するようなものはありませんでしたので
(あったらコンパイルした時点でエラーですが)
「JARを入れすぎてSessionが有効になっていなかった」ではないと思います。

AndroidアプリでAPK(アプリバイナリ)にライブラリを含めるには
Eclipseでビルドパスを通すのではなく、プロジェクトの/libsに
配置しなければいけませんが、原因はここではないですか?

以上

2013年10月22日火曜日 9時50分18秒 UTC+9 omimat...@gmail.com:
Session 抜けました。

jarファイルに余計なファイルをつけすぎてSessionが有効になってなかったみたいです。
引き続きデバッグしてみます。

omimat...@gmail.com

unread,
Oct 23, 2013, 5:03:27 AM10/23/13
to android-g...@googlegroups.com
Kawaseさん、アドバイスありがとうございます。

改めて確認しましたが確かにおしゃるとおりです。
一度全部のビルドパスとjarを削除行ってmail,additional,activationのjarのみを
/libフォルダに追加、jarファイルを右クリックでビルドパス追加の方法で変更したところ
PASSしました。その他のjarははずしてデバッグしてます。

現状connect部分でまた詰まってますので整理したらまた投稿したいと思います。
ここまできたら自分で解決できそうなんですが…

omimat...@gmail.com

unread,
Oct 25, 2013, 1:07:24 AM10/25/13
to android-g...@googlegroups.com
すみません、どうしてもつまずいてしまってます。
store.connect部分でとまってしまいます。ここから例外のMessaging Exception
に移動してしまいます。

以下、プログラム本文です。
##############################################################################
Properties props =  new Properties(); 

// プロパティに設定を追加 
   props.setProperty("mail.imaps.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
   props.setProperty("mail.imaps.socketFactory.fallback", "false");
props.setProperty("mail.transport.protocol", "imaps");
props.setProperty("mail.imaps.host", "imaps.gmail.com");
props.setProperty("mail.imaps.quitwait", "false");
// セッションを取得 
Session session = Session.getDefaultInstance(props,null);

try {

// ストアに接続 
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", "xx...@gmail.com","xxxx"); 
// open the inbox folder
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);

// get a list of javamail messages as an array of messages
   // get the list of inbox messages
   Message[] messages = inbox.getMessages();

   if (messages.length == 0) Log.d("msg","No messages found.");

   inbox.close(true);
   store.close();
 
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
ここから以下ログを添付いたします。長くて申し訳ありません。
##############################################################################
I/Adreno200-EGL(23357): <qeglDrvAPI_eglInitialize:265>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_JB_2.5_RELEASE.04.02.02.69.019_msm8960_JB_2.5_RELEASE_CL3385939_release_AU (CL3385939)
I/Adreno200-EGL(23357): Build Date: 04/18/13 Thu
I/Adreno200-EGL(23357): Local Branch: 
I/Adreno200-EGL(23357): Remote Branch: m/jb_2.5_release
I/Adreno200-EGL(23357): Local Patches: NONE
I/Adreno200-EGL(23357): Reconstruct Branch: AU_LINUX_ANDROID_JB_2.5_RELEASE.04.02.02.69.019 +  NOTHING
I/QCNEA(23357): |NIMS| getaddrinfo: hostname imap.gmail.com servname NULL numeric 4 appname 
W/System.err(23357): javax.mail.MessagingException: Couldn't connect using "javax.net.ssl.SSLSocketFactory" socket factory to host, port: imap.gmail.com, 993; Exception: android.os.NetworkOnMainThreadException;
W/System.err(23357):   nested exception is:
W/System.err(23357): java.io.IOException: Couldn't connect using "javax.net.ssl.SSLSocketFactory" socket factory to host, port: imap.gmail.com, 993; Exception: android.os.NetworkOnMainThreadException
W/System.err(23357): at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:571)
W/System.err(23357): at javax.mail.Service.connect(Service.java:288)
W/System.err(23357): at javax.mail.Service.connect(Service.java:169)
W/System.err(23357): at com.example.gmail_reader4.MainActivity.mailcheck(MainActivity.java:51)
W/System.err(23357): at com.example.gmail_reader4.MainActivity.access$0(MainActivity.java:33)
W/System.err(23357): at com.example.gmail_reader4.MainActivity$1.onClick(MainActivity.java:27)
W/System.err(23357): at android.view.View.performClick(View.java:4268)
W/System.err(23357): at android.view.View$PerformClick.run(View.java:17477)
W/System.err(23357): at android.os.Handler.handleCallback(Handler.java:725)
W/System.err(23357): at android.os.Handler.dispatchMessage(Handler.java:92)
W/System.err(23357): at android.os.Looper.loop(Looper.java:137)
W/System.err(23357): at android.app.ActivityThread.main(ActivityThread.java:5159)
W/System.err(23357): at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(23357): at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err(23357): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:810)
W/System.err(23357): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:577)
W/System.err(23357): at dalvik.system.NativeStart.main(Native Method)
W/System.err(23357): Caused by: java.io.IOException: Couldn't connect using "javax.net.ssl.SSLSocketFactory" socket factory to host, port: imap.gmail.com, 993; Exception: android.os.NetworkOnMainThreadException
W/System.err(23357): at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:178)
W/System.err(23357): at com.sun.mail.iap.Protocol.<init>(Protocol.java:107)
W/System.err(23357): at com.sun.mail.imap.protocol.IMAPProtocol.<init>(IMAPProtocol.java:104)
W/System.err(23357): at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:538)
W/System.err(23357): ... 16 more
W/System.err(23357): Caused by: android.os.NetworkOnMainThreadException
W/System.err(23357): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1126)
W/System.err(23357): at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
W/System.err(23357): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
W/System.err(23357): at java.net.InetAddress.getByName(InetAddress.java:289)
W/System.err(23357): at java.net.InetSocketAddress.<init>(InetSocketAddress.java:105)
W/System.err(23357): at java.net.InetSocketAddress.<init>(InetSocketAddress.java:90)
W/System.err(23357): at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:233)
W/System.err(23357): at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:163)
W/System.err(23357): ... 19 more
##############################################################################

kacodama

unread,
Oct 25, 2013, 1:20:29 AM10/25/13
to android-g...@googlegroups.com
NetworkOnMainThreadExceptionでぐぐれば答えはいっぱい落ちてると思います。

omimat...@gmail.com

unread,
Oct 25, 2013, 1:35:34 AM10/25/13
to android-g...@googlegroups.com
kacodamaさん、ありがとうございます。

なるほど、メインスレッドでネットワーク処理を行うと例外がスローされるようになってるんですね。
これまた初心者に優しくない仕様で…。当方Android4.2でデバッグ中です。2.3.3なら動きそうなのに
壊れてしまったし。
ちと調べるのに時間かかりそうです。


2013年10月25日金曜日 14時20分29秒 UTC+9 kacodama:
NetworkOnMainThreadExceptionでぐぐれば答えはいっぱい落ちてると思います。

田代透

unread,
Oct 25, 2013, 1:39:43 AM10/25/13
to android-g...@googlegroups.com
 別スレッドでも話されていますが、メインスレッドでIOなど処理時間の読めない処理を行うと
端末の動作に不具合が出るので、そのようなことが無いように別スレッドで動かすべきと規定された、

と、考えれば初心者にやさしい仕様に変わったとも考えられます。


ネットワークや別のサービスとの連携とかって、初心者ってレベルではないと思います。



2013年10月25日 14:35 <omimat...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
--
Toru Tashiro
toru...@gmail.com

omimat...@gmail.com

unread,
Oct 25, 2013, 2:36:30 AM10/25/13
to android-g...@googlegroups.com
Toruさん、申し訳ありません。個々によって定義の違う初心者などという言葉を
軽はずみに使うべきではありませんでした。おまけにぐちってしまいまして反省しております。
読んでる方で気分を害された方は申し訳ありません。

確かにおっしゃるとおりで今回の仕様については動作としては正しい内容ですね。

とりあえずAndroid2.3.5の機種見つけてきてで試したら動きました。
今から別スレッドで対応してみます。



2013年10月25日金曜日 14時39分43秒 UTC+9 Toru:
 別スレッドでも話されていますが、メインスレッドでIOなど処理時間の読めない処理を行うと
端末の動作に不具合が出るので、そのようなことが無いように別スレッドで動かすべきと規定された、

と、考えれば初心者にやさしい仕様に変わったとも考えられます。


ネットワークや別のサービスとの連携とかって、初心者ってレベルではないと思います。



2013年10月25日 14:35 <omimat...@gmail.com>:
kacodamaさん、ありがとうございます。

なるほど、メインスレッドでネットワーク処理を行うと例外がスローされるようになってるんですね。
これまた初心者に優しくない仕様で…。当方Android4.2でデバッグ中です。2.3.3なら動きそうなのに
壊れてしまったし。
ちと調べるのに時間かかりそうです。


2013年10月25日金曜日 14時20分29秒 UTC+9 kacodama:
NetworkOnMainThreadExceptionでぐぐれば答えはいっぱい落ちてると思います。

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。

Hidetaka Kawase

unread,
Oct 25, 2013, 6:00:05 AM10/25/13
to android-g...@googlegroups.com
Kawaseです。

この流れで素直にThread使いはじめるとアレなので念のため…
メインスレッドとは別のスレッドで処理したい場合はAsyncTaskを使います。
既にご存知でしたら無視して下さい。

2013年10月25日金曜日 15時36分30秒 UTC+9 omimat...@gmail.com:

omimat...@gmail.com

unread,
Oct 28, 2013, 8:32:14 PM10/28/13
to android-g...@googlegroups.com
回答いただきました皆様、ありがとうございました。

無事AsyncTaskにて動作確認取れました。
先日、非同期処理について教えてもらったばかりでしたのですんなりと
動作させることができました。

これからも精進したいと思います。無礼があったときはご指摘ください。
失礼なことが多すぎて申し訳ありませんでした。


Reply all
Reply to author
Forward
0 new messages