#はじめに
Delphi10 でAndroidアプリを作るの2本目です。
↓1本目はこちら
https://qiita.com/kenken2go/items/f2459caaa6cd649dae33
Internet系コンポーネントIndy もモバイルアプリで使えるとのことなので
今回はメール受信をやってみました。opensslを使ってTLSをサポートすることで
GMAILやOffice365でも使えることを確認してみます。
#評価環境
開発マシン: Windows10 professional (Core i5-3337U 1.8GHzで重いですT_T)
Delphi : Delphi 10.3.3 Community Edition
Androidマシン:Nexus7 (32bit)
Androidバージョン:6.0.1
#Android側の準備
開発マシンとNexus7をUSBケーブルでつなぐ
設定-開発者向けオプションで
・USBデバッグモードをONにする
・スリープモードにしないをONにする
#画面作成
メール受信設定、ボタン類、メールタイトル、メール本文 のコンポーネントを
配置します。
#ソースコード
unit pop1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
System.ioutils,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base,
FMX.ListView, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL,
IdSSLOpenSSL, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdExplicitTLSClientServerBase, IdMessageClient, IdPOP3, IdSSLOpenSSLHeaders,
FMX.Controls.Presentation, FMX.StdCtrls, IdMessage, FMX.ScrollBox, FMX.Memo,
Data.Bind.Components, Data.Bind.ObjectScope, FMX.Edit;
type
TForm1 = class(TForm)
mm_body: TMemo;
Panel1: TPanel;
Panel2: TPanel;
ed_msgno: TEdit;
Label1: TLabel;
lb_msgcount: TLabel;
btn_show: TButton;
btn_logon: TButton;
btn_logoff: TButton;
ed_host: TEdit;
Label3: TLabel;
Label4: TLabel;
ed_port: TEdit;
Label5: TLabel;
ed_id: TEdit;
Label6: TLabel;
ed_password: TEdit;
cb_tls: TCheckBox;
lb_subject: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btn_logonClick(Sender: TObject);
procedure btn_logoffClick(Sender: TObject);
procedure btn_showClick(Sender: TObject);
private
{ private 宣言 }
pop : TIdPOP3;
ssl : TIdSSLIOHandlerSocketOpenSSL;
msg : TIdMessage;
public
{ public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
{$R *.LgXhdpiTb.fmx ANDROID}
{$R *.Windows.fmx MSWINDOWS}
// 起動時処理
procedure TForm1.FormCreate(Sender: TObject);
begin
ssl := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
ssl.SSLOptions.SSLVersions := [sslvTLSv1,sslvTLSv1_2];
ssl.SSLOptions.Method := sslvTLSv1_2;
IdOpenSSLSetLibPath(TPath.GetDocumentsPath); //OpenSSLのライブラリパス設定
pop := TIdPOP3.Create(nil);
pop.AutoLogin := True;
msg := TIdMessage.Create(nil);
ed_host.Text := 'pop.gmail.com';
ed_port.Text := '995';
ed_id.Text := 'xxxxxx@gmail.com';
ed_password.Text := '********';
ed_msgno.Text := '1';
mm_body.Lines.Clear;
end;
// 終了時処理
procedure TForm1.FormDestroy(Sender: TObject);
begin
pop.Free;
ssl.Free;
msg.Free;
end;
// logoffボタン
procedure TForm1.btn_logoffClick(Sender: TObject);
begin
if pop.Connected then
pop.Disconnect;
lb_msgcount.Text := '---';
end;
//Logonボタン サーバーに接続しログオンする
procedure TForm1.btn_logonClick(Sender: TObject);
begin
pop.Host := ed_host.Text;
pop.Username := ed_id.Text;
pop.Password := ed_password.Text;
pop.Port := StrToInt(ed_port.Text);
if cb_tls.IsChecked then
begin
ssl.Host := pop.Host;
ssl.Port := pop.Port;
pop.IOHandler := ssl;
pop.UseTLS := utUseImplicitTLS;
end
else
begin
pop.UseTLS := utNoTLSSupport;
pop.IOHandler := nil;
end;
try
pop.Connect;
lb_msgcount.Text := InttoStr(pop.CheckMessages); //メール件数取得
Except
on e : Exception do
begin
lb_msgcount.Text := '---';
ShowMessage(e.Message);
end;
end;
end;
//Showボタン 指定のメッセージ番号のメールを受信しタイトルと本文を表示
procedure TForm1.btn_showClick(Sender: TObject);
begin
pop.Retrieve(StrtoInt(ed_msgno.Text),msg); //指定番号のメッセージ取得
lb_subject.Text := msg.Subject; //メールタイトル
mm_body.lines.Assign(msg.Body); //メール本文
end;
end.
#OpenSSLライブラリの配置
Android6よりOpenSSLが入っていないらしく、何もしないとログオン時に
「SSLライブラリを読み込めません」エラーが出ます。
・ライブラリのダウンロード
libcrypto.soとlibssl.so の2ファイルが必要です。
私はここからバイナリを入手出来ました。
https://drive.google.com/file/d/0B7AxqW32K0oXWW9nUk9qaFpHT0k/view
ソースからコンパイルできる方はそちらの方がよい気がします。
・Delphi プロジェクト-配置 で配置マネージャを開き、
ダウンロードしたファイルを追加します。
リモートパスに assets/internal と指定し、プログラム側にもパスの指定を行う
記述を追加します。
IdOpenSSLSetLibPath(TPath.GetDocumentsPath);
※サラッと書きましたが実はここで非常に苦戦しました。
#実行
ソース、プロジェクトを保存し実行します。
GMAILの場合設定が正しいにも関わらず
「Username and password not accepted」とエラーが出てログオンできません。
これは安全性の低いアプリと判定されている様です。
Googleのアカウント設定で安全性の低いアプリのアクセスの許可を有効にすると
ログオンできるようになりました。
安全性の高いアプリにする方法は現時点では調べ切れていません(^^;
安全性の低いアプリのアクセスの許可を有効にして受信が出来るようになりました。
めでたし めでたし