This page (revision-1) was last changed on 20-Apr-2024 11:53 by UnknownAuthor

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
20-Apr-2024 11:53 4 KB UnknownAuthor

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 1 added 84 lines
[{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]