[{PageViewPlugin}] [Send Message by Gmail], [Twitter Kit Android] !!!Abstract Gmailを[Android]から送ろうとして、結構苦労したので記録します。2018年8月30日でやっとできた。これだけで2週間費やしたかも。 !!!Topic !!Oauth of Firebase |at first I will try to implement Oauth of Google by using [Firebase]. |どうしてもconnect failed: ECONNREFUSED (Connection refused)が出て進まない。。。 {{{ com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.gmail.com, 465; timeout -1; nested exception is: java.net.ConnectException: failed to connect to smtp.gmail.com/2404:6800:4008:c01::6c (port 465) from /:: (port 54402): connect failed: ECONNREFUSED (Connection refused) }}} |パスワードも設定した。いくつかの例[1]も実装したが、かわらない。 |Google側の設定があるのか?2段階認証にしないといけないの?安全性の低いアプリの許可を一時的に有効にしても変わらない。 |TLSの方がいいのか。そうしてみたけど変わらん。 |OAuthでGoogleにログインした後だったら変わるか?変わらない。。。 !!Based on Java base sample |しばらくたってから[Javaで成功したパターン|Send Message by Gmail]を試してみる。なかなかコンパイルできない。 {{{ Error: Program type already present: com.google.common.annotations.Beta }}} {{{ Error: Program type already present: com.google.common.annotations.GwtCompatible }}} {{{ Cannot fit requested classes in a single dex file. Try supplying a main-dex list. }}} |[2]を参考に以下の設定をgradleに追加するとコンパイルは通るようになるが。。。 {{{ defaultConfig { ... multiDexEnabled true ... dependencies { ... implementation('com.google.api-client:google-api-client:1.23.0') { exclude module: 'guava-jdk5' } implementation ('com.google.apis:google-api-services-gmail:v1-rev83-1.23.0'){ exclude module: 'guava-jdk5' } ... implementation 'com.android.support:multidex:1.0.3' }}} |今度は以下のようなエラーが発生。androidはJKSに対応していない?BKSを使いなさい[3]? {{{ W/System.err: java.security.KeyStoreException: JKS not found at java.security.KeyStore.getInstance(KeyStore.java:890) at com.google.api.client.util.SecurityUtils.getJavaKeyStore(SecurityUtils.java:53) at com.google.api.client.googleapis.GoogleUtils.getCertificateTrustStore(GoogleUtils.java:74) W/System.err: at com.google.api.client.googleapis.javanet.GoogleNetHttpTransport.newTrustedTransport(GoogleNetHttpTransport.java:55)}}} |代わりに下記のメソッドで代用してみる[4]. なんか進んだ気がする。 {{{ HTTP_TRANSPORT = new com.google.api.client.http.javanet.NetHttpTransport(); }}} |その後、設定フォルダや一時保存フォルダあたりを整理しつつ、実装を進めたが、Oauth周りで、Javaのコンソールアプリケーションでできたことができない。com.google.api.services.gmail.Gmailオブジェクトさえうまく作れれば。。。やはりサーバ側で送るようにしたほうがいいのか。。。もう一度、今の知識をもとに、FirebaseのAuth機能を使うことも考えられるが、GMAIL APIにSCOPEインプットしてとかできるのか。なんとなく想定されていない気がする。 !!Gmail.Builder |Gmail.BuilderのAPIのJavadocをみていると、Androidで使うべきライブラリが違う気がしてきた。 |com.google.api.client.googleapis.javanet.GoogleNetHttpTransport#newTrustedTransport()ではなく、com.google.api.client.extensions.android.http.AndroidHttp#newCompatibleTransport()など |JacksonFactoryをAndroidJsonFactoryとか |AuthorizationCodeInstalledApp.authorize()でどうもjava.awt.Desktopを探している。これはAndroidで使うクラスじゃないと思っている。GoogleAuthorizationCodeFlowがブラウザ立ち上げて認証とかしているので、そのままでは、Androidに適用できない。 !!AccountManager |AndroidでつかうOauthをまとめている情報発見[5].ここから呼ばれているGithub上のコードをみつつ進めてみよう。このうちAndroidのAccountManagerを使うやり方に注目してみる。[5]でいうパターン5。Gmailオブジェクトをつくるところまでローカルで実施して、UserRecoverableAuthIOExceptionを受け取ってからOauth認証を実施するやり方と理解。しかしこのExceptionを出す前に以下のエラーが出て行き詰まる。 {{{ Rejecting re-init on previously-failed class java.lang.Class<javax.activation.DataHandler>: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/awt/datatransfer/Transferable; }}} |build.gradleのdependencyに {{{ implementation 'com.sun.mail:android-mail:1.6.0' implementation 'com.sun.mail:android-activation:1.6.0' }}} |を追加する。javax.mail:mail:1.4.7'とか呼んでたら、消しておく。 |そういえばこのアプローチで、credentials.jsonのような接続先を指定するのはどこだろう。OAuth03でもどこかで指定している。どこだ?Activityができるときのはず。Credentialを作るときはもうActivityがプロジェクトのURLを持っていた。それがkurukurupapaだからエラーが出る。わからない。 |エラーが起こるMimeMessageはAndroid用じゃない?もしくはコントラクタで指定しているSessionか。そこででてくるauthenticatorがあやしくないか。うーん、いまいちGoogle先生の切れが悪い。=検索の仕方の問題か |Tokenをうんぬんというのを整理したほうがいいかもしれない。 |2018年8月30日、やったーできた。depencencyの問題だった。他はエラーメッセージで対応可能だった。GMAIL APIの有効化とか。 !!!Reference #[#1]zuccyi、2015年11月、[Android] Gmailアカウントでメールを送信する, [https://qiita.com/zuccyi/items/9757ad0308d784a09c35] #[#2]StackOverflow, 2018年1月, https://stackoverflow.com/questions/48249633/errorcannot-fit-requested-classes-in-a-single-dex-file-try-supplying-a-main-dex, [https://stackoverflow.com/questions/48249633/errorcannot-fit-requested-classes-in-a-single-dex-file-try-supplying-a-main-dex] #[#3]さとう, 2013年5月, Re: 「android-group-japan: 22938」 「質問」GoogleDriveのOAuth2認証に失敗する件について, [https://groups.google.com/forum/#!topic/android-group-japan/2GLn3PVBVkY] #[#4]StackOverFlow, 2016年8月31日, GoogleNetHttpTransport.newTrustedTransport() returning Null, [https://stackoverflow.com/questions/39248453/googlenethttptransport-newtrustedtransport-returning-null] #[#5]@kurukurupapa@github, 2014年11月21日, AndroidでOAuth認証をしたい, [https://qiita.com/kurukurupapa@github/items/fee066909294e177026a]