Delphi10 AndroidでTLS対応メール受信

#はじめに
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にする

#画面作成
メール受信設定、ボタン類、メールタイトル、メール本文　のコンポーネントを
配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/7e1f3138-3bf8-013f-54e8-4a249534ee86.png)

#ソースコード

```Pascal
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 と指定し、プログラム側にもパスの指定を行う
記述を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/9b376b4f-b4dc-b9e7-24ae-a77947a86318.png)

```Pascal:追加部分
   IdOpenSSLSetLibPath(TPath.GetDocumentsPath);
```
※サラッと書きましたが実はここで非常に苦戦しました。

#実行
ソース、プロジェクトを保存し実行します。
GMAILの場合設定が正しいにも関わらず
「Username and password not accepted」とエラーが出てログオンできません。
これは安全性の低いアプリと判定されている様です。
Googleのアカウント設定で安全性の低いアプリのアクセスの許可を有効にすると
ログオンできるようになりました。
安全性の高いアプリにする方法は現時点では調べ切れていません(^^;
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/71ecc50c-4aa1-c473-823d-266fa9872f42.png)
安全性の低いアプリのアクセスの許可を有効にして受信が出来るようになりました。
めでたし　めでたし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/b8542ff5-d012-48f4-8deb-78fd7ffbf812.png)