こんにちは。
indy10を使ってAndroidデバイスでメール送受信をするプログラムに挑戦しています。
ちなみに送信側はGmailです。
https://www.petitmonte.com/bbs/answers?question_id=8859のサイトに
なにやらヒントがあるようなのですが
紹介されていました下記のサイトをオープンすることができず・・・
https://ht-deko.com/tech040.html#tech076
どなたかヒントを頂くことができますでしょうか。
環境は
Delphi 10.1 Berlin Enterprise
です。
よろしくお願いいたします。
DEKOさんのところ、見えませんか?こちらでは何の問題もなく表示できていますが…
自分もDEKOさんのところを問題無く見る事が出来ます。
パソコンのネットワーク設定の1つのDNSの設定を8.8.8.8とか1.1.1.1とか
有名な Public DNS にしてみるとページが表示されるかもしれません。
もしサンプルでも送信出来ないのであれば
2018年頃に行われたGmailのセキュリティレベルアップに引っかかっているかも知れません。
Indyの送信で OAUTH2認証が設定出来るのであればそれで行けます。
対応していない場合はGoogleにログインして二段階認証を有効にして
GMail用のパスワードを取得してそちらの方を使うようにして下さい。
なお送信設定にて送信認証をPLAIN TEXTに設定して送信するとすぐにGoogleから警告が来ますので注意して下さい。
HFUKUSHIさん、arigayasさん、takeさん お返事ありがとうございます。
ご指摘の通り見れました。
あの時は何だったのかな~
申し訳ありませんでした。
早速、ご案内通りことを進めたのですが、
https://ht-deko.com/tech033.html#tech062 にある
ダウンロードは ftp://indy.fulgan.com/ZIP/ から行います。
がダウンロードできませんでした。(これまた開かない)
他のサイトでダウンロードできるのでしょうか。
ftpとして置いた先がSSL対応のため HTTPSになってますね。
このリンクは見えますか?
takeさん、早々のご回答ありがとうございます。
開けました。
沢山、ありましたがどのファイルを使うのでしょうか。
openssl-1.0.2u-i386-win32.zip
openssl-1.0.2u-x64_86-win64.zip
1.0.2u がバージョン番号なのでアルファベットが新しい方が良いかな?
i386-win32は32bitのOS用
x64_86-win64は64bitのOS用
環境で選びましょう
takeさんご回答ありがとうございます。
頑張ります。
お世話になります。
AndroidOpenssl1.0.1t.zip
AndroidOpenssl1.0.2h.zip
OpenSSL 1.0.2g Android.zip
の3つのファイルをダウンロードして
解凍したのですがDLLファイルは存在しませんでした。(どのzipファイルもlibcrypto.so、libssl.soの2つだけ)
どのように、すればよいのでしょうか。
お手数おかけしますが
ご教授の程よろしくお願いいたします。
OpenSSL - RAD Studio
http://docwiki.embarcadero.com/RADStudio/Rio/ja/OpenSSL#iOS_.E3.82.B7.E3.83.9F.E3.83.A5.E3.83.AC.E3.83.BC.E3.82.BF.E3.80.81OS_X.E3.80.81Android_.E3.81.AE.E5.A0.B4.E5.90.88
によるとAndroidデバイスはDLLとかsoは特に必要なさそうです。
Indy ネットワーク接続のセキュリティ保護 - RAD Studio
http://docwiki.embarcadero.com/RADStudio/Rio/ja/Indy_%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%8E%A5%E7%B6%9A%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E4%BF%9D%E8%AD%B7
も参考にしてください。
HFUKUSHIさん ご回答ありがとうございます。
紹介いただいたURLは「RAD Studio 10.3 Rio」の資料でした。
私が使っているDelphi 10.1 Berlinでは無理のようです。
がっかり・・・
どうしようかな~
OpenSSL - RAD Studio
http://docwiki.embarcadero.com/RADStudio/Berlin/ja/OpenSSL#iOS_.E3.82.B7.E3.83.9F.E3.83.A5.E3.83.AC.E3.83.BC.E3.82.BF.E3.80.81OS_X.E3.80.81Android_.E3.81.AE.E5.A0.B4.E5.90.88
Indy ネットワーク接続のセキュリティ保護 - RAD Studio
http://docwiki.embarcadero.com/RADStudio/Berlin/ja/Indy_%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%8E%A5%E7%B6%9A%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E4%BF%9D%E8%AD%B7
HFUKUSHIさん度々お世話になります。
ありがとうございます。
ホームにボタンを配置しClickイベントを記述しただけのものです。
Androidデバイスで実行すると
「プロジェクト****.apkは例外クラスEIdOSSLCouldNotLoadSSLLibray
(メッセージ'SSLraibraryが読み込めませんでした。)を送出しました」
という警告がでてメール送信できません。
何が原因なのかな
************************************************************
unit Main;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls, IdTCPConnection, IdTCPClient,
IdBaseComponent, IdComponent, IdIOHandler, IdIOHandlerSocket,
IdIOHandlerStack, IdSSL, IdSSLOpenSSL;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ private 宣言 }
public
{ public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
{$R *.LgXhdpiTb.fmx ANDROID}
uses
IdMessage, IdSMTP,IdExplicitTLSClientServerBase, IdEMailAddress;
procedure TForm1.Button1Click(Sender: TObject);
var
smtp: TIdSMTP;
ssl: TIdSSLIOHandlerSocketOpenSSL;
msg: TIdMessage;
begin
// Client.IOHandler := TIdSSLIOHandlerSocketOpenSSL1.Create;
smtp:=TIdSMTP.Create();
try
smtp.Host:='smtp.gmail.com';
smtp.Port:=465;
smtp.Username:='******@gmail.com';
smtp.Password:='vds9ecuS';
ssl:=TIdSSLIOHandlerSocketOpenSSL.Create();
try
ssl.Host:=smtp.Host;
ssl.Port:=smtp.Port;
ssl.Destination:=ssl.Host+':'+IntToStr(ssl.Port);
smtp.IOHandler:=ssl;
smtp.UseTLS:=TIdUseTLS.utUseImplicitTLS;
smtp.Connect;//接続
msg:=TIdMessage.Create();
try
msg.ContentType:='text/plain';
msg.CharSet:='UTF-8';
msg.ContentTransferEncoding:='BASE64';
msg.From.Address:=******@gmail.com';//メールの送り元。通常はgmailのアドレス
msg.Recipients.Add.Address:='123456@zzzzz.co.jp' ;//送り先1人目
// msg.Recipients.Add.Address:='hoge_to2@hoge.hoge' ;//送り先2人目。不要な場合はこの行を削除
// msg.CCList.Add.Address :='hote_cc1@hoge.hoge' ;//Ccの送り先。不要な場合はこの行を削除
// msg.BccList.Add.Address :='hoge_bcc1@hoge.hoge';//Bccの送り先。不要な場合はこの行を削除
msg.Subject:='メールの件名を記述';
msg.Body.Add('メール本文1行目');
msg.Body.Add('メール本文の2行目');
smtp.Send(msg);//メールの送信
finally
msg.Free;
end;
smtp.Disconnect();
finally
ssl.Free;
end;
finally
smtp.Free;
end;
end;
end.
皆様、お世話になります。
あれから、色々触っていたら
「メッセージ'SSLraibraryが読み込めませんでした」のエラーはでなくなりました。
しかし、アプリのボタンをクリックすると
「SSLライブラリが読み込めませんでした」というメッセージが表示されます。
原因わかりませんでしょうか。
こんにちは。mamと申します。
http://mam-mam.net/delphi/android_openssl_aes256.html
にあるように、android用のopensslライブラリ
ibcrypto.so
libssl.so
ファイルを、ネットから探してダウンロードして、
delphiのIDEからプロジェクト⇒配置から、上記2ファイルを配置し、
IdOpenSSLSetLibPath(System.IOUtils.TPath.GetDocumentsPath);
として、indyにopensslライブラリファイルの位置を指定してあげる必要が有るのではないでしょうか?
外していたらすいません。
mamさん貴重なアドバイス誠にありがとうございます。
ibcrypto.so
libssl.so
の2つのファイルをプログラムソースフォルダに入れて
プロジェクト > 配置 に2つのファイルを追加しました。
その2つのファイルのリモートパスは
asets\internal
です。
この状態でAndroidデバイスで実行したところ
「アドレス smtp.gmail.com の解決時にエラーが発生しました(7)」
というエラーが発生しました。
Windowsデバイスで実行すると正常にメール送信されます。
あと、mamさんのご指摘の
IdOpenSSLSetLibPath(System.IOUtils.TPath.GetDocumentsPath);
として、indyにopensslライブラリファイルの位置を指定してあげる必要が有るのではないでしょうか?
IdOpenSSLSetLibPath(System.IOUtils.TPath.GetDocumentsPath); はどこで指定すればよいのでしょうか。
お手数ですが 教えて頂けませんでしょうか。
mamさん
すみません!
AndroidデバイスのWi-Fi設定がOFFでした。
大変失礼しました。お恥ずかしい・・・
結果ですが やはり「SSLライブラリが読み込めませんでした」
というメッセージが発生してメール送信できませんでした。
mamさんが教えてくれましたサイトにありました。
uses
System.StartUpCopy,
FMX.Forms,
Unit1 in 'Unit1.pas' {Form1},
MamAndroidOpenSSL in 'MamAndroidOpenSSL.pas',
IdSSLOpenSSL,IdSSLOpenSSLHeaders,System.IOUtils;
{$R *.res}
begin
IdOpenSSLSetLibPath(System.IOUtils.TPath.GetDocumentsPath);
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
の赤字の2行を追加して実行したら
「SSLで接続する際にエラーが発生しました。
error: 1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number」
というエラーが発生しました。
お世話になります。
smtp.Portを25にしたら送信できました。
なぜ465だと送信できないのか・・・・?
送信はできたのですが
msg.Subject := 'メールの件名を記述';
の記述が????????になっています。
日本語対応にするにはどうすればよいのでしょうか?
同じソースでWindowsデバイスで実行すると
subjectは日本語になるのですが
Androidデバイスでは文字化けします。
CharSet や ContentTransferEncoding を
色々変更してみたのですが
文字化けしてしまいます。
どなたか、教えて頂けませんでしょうか。
よろしくお願いいたします。
デバッグ出来るのであれば送信直前で止めて送ろうとしているヘッダやボディを見る。
または受信側のメールソフトで「ソースの表示」で内部構造を表示させて両者の違いを見ないとわからないですね。
メールの日本語、特にUNICODEを送ろうとすると、どうやって送るのが正しいのか不明です。
takeさんお返事ありがとうございます。
受信側のメーラー(outlook2016)で
UNCODE(UTF-8)以外にすると
SUBJECTだけではなく
BODYも文字化けしてしまします。
outlook2016の場合は
https://www.wanichan.com/pc/outlook/2016/1/18.html
の方法でヘッダを覗けますので、文字化けしているメールと正常なメールを比較してみて下さい。
//以下プロシージャを追加
procedure TForm1.msgOnInitializeISO(var VHeaderEncoding: Char;
var VCharSet: String);
begin
VHeaderEncoding:='B';
VCharSet:='UTF-8';
end;
procedure TForm1.Button1Click(Sender: TObject);
//略
//以下一行を追加してから
msg.OnInitializeISO:=msgOnInitializeISO;
//メールを送信
smtp.Send(msg);//メールの送信
//略
では如何でしょうか。
ツイート | ![]() |