delphi2007 indy を使用してメール送信を行っています。
プロパイダより「SSL 3.0」接続の廃止の通達がきてTLS 1.0、TLS 1.1、TLS 1.2で接続するよう求められています。
このあたりの設定を意識したことはなく以下のコーディングで動作しています。
IdSMTP := TIdSMTP.Create(nil);
IdSMTP.Port := 587;
IdSMTP.Host := 'xxxxx.jp';
IdSMTP.AuthenticationType := atLogin;
IdSMTP.Username := 'xxxxx';
IdSMTP.Password := 'xxxxx';
:
:
:
IdSMTP.Connect;
IdSMTP.Send(msg);
IdSMTP.Disconnect;
コーディングの変更が必要なのかも判断できていない状態です。
対応方法等何を参考にすればよいか教えていただけないでしょうか。
よろしくお願いします。
プロバイダの設定はわかりませんが、
587ポートでもSSL3.0などで動作している可能性があります。
本当に動作するのかの確認はSSL3.0が使えないメールサービスのメールアドレスを取得するか
フリーまたは一部有料のメールサーバーソフトを起動して確認した方が良いです。
ソースで気になるのは「OpenSSL」の設定が無いところでしょうか?
ご回答ありがとうございます。
ポート単位でSSL3.0、TLS 1.0とプロパイダ側で設定できるものなのでしょうか?
だとしたらプロパイダにTLS 1.0のポートを聞いてみれば解決しそうです。
また、コーディングでTLS 1.0指定とかできる方法があれば知りたいです。
今は「OpenSSL」などの記述は何もしていません。
よろしくお願いします。
プロバイダがどんなメールサーバーを使っててどんな設定なのかはプロバイダしかわかりません。
どういう通信が行えるのかはメールサーバーにTelnetで接続して情報取得する方法があります。
肝心のIndyでTLS通信をする方法ですが
エンデバカデロに「Indy ネットワーク接続のセキュリティ保護」に記載されています。
URLに漢字が含まれていますので 「HOME」のリンクに貼ってみます
現在はサブミッションポート(587番ポート)を使っていて、多分非暗号化通信を行っていると思います。
587番で暗号化通信を行う場合は、StartTLS(IndyではIdSMTP1.UseTLS:=TIdUseTLS.utUseImplicitTLS)を使うはずだからです。
(StartTLSとは非暗号化通信で接続し、要所要所で暗号化通信を行う方式だったような気がします)
TIdSSLIOHandlerSocketOpenSSLには
SSLOptions.Methodプロパティがあって、TLSバージョンが指定できそうです。
procedure TForm1.Button1Click(Sender: TObject);
begin
IdSMTP1.IOHandler:=IdSSLIOHandlerSocketOpenSSL1;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method:=sslvTLSv1_2;
end;
take様のリンクにあるように、IndyでSSL/TLSを使う場合は
https://indy.fulgan.com/SSL/
などからOpenSSLをダウンロード、解凍し、
libeay32.dll
ssleay32.dll
ファイルをパスの通った場所(c:\windowsフォルダや、実行ファイルと同じ位置等)に配置が必要だと思います。
すいません、上記間違えました。
StartTLSを使うには、
IndyではIdSMTP1.UseTLS:=TIdUseTLS.utUseExplicitTLS
です。
すいません。
take様 mam様
貴重なアドバイスありがとうございます。感謝します。
プロパイダの仕様変更が2月末なのですが
アドバイスを参考に改定して現段階で検証をしてみたいと思います。
途中でつまづけば、またご相談させてください。
よろしくお願いします。
もしかしてですが、
「
ポート456(暗号化通信)を使って、SSL3.0以下を使っている場合は、TLS 1.0以上を使ってください。
ポート587をお使いの場合は、そもそも暗号化通信していないので、関係ございません。
」
という意味かもしれません。
外していたら、メールを送れなくなるので、よくご確認した方が良いですが。
日があいてしまいましたが教えていただきたいです。
OpenSSLを実装すべくWindows直下にlibeay32.dll,ssleay32.dllの64bit版を配置しました。
下記の記述をしているのですがコンパイルでエラーがでてしまいます。
uses
IdMessage,IdSSLOpenSSL,IdSMTP,IdExplicitTLSClientServerBase
,IdEMailAddress;
エラー:「IdExplicitTLSClientServerBase.dcuが見つかりません」
コンポーネントはTidSMTP,TidMessage,TidPOP3を配置しています。他に必要でしょうか。
エラーの原因が特定できません。アドバイスいただけないでしょうか。
環境を見ずに答えていました。誠に申し訳ないです。
> delphi2007 indy(多分バージョン9)
DEKO様のサイトにあるように、indy10をインストールすればコンパイルできるようになるかもしれません。
https://ht-deko.com/tech034.html#10.2.3
>Windows直下にlibeay32.dll,ssleay32.dllの64bit版を配置しました。
delphi2007は32Bit版のコンパイルしかできないので、32Bit版のOpenSSLでなければならないと思います。
また、余計なおせっかいですが、お使いのdelphiのバージョンがかなり古いので
新しいものをお使いになることをお勧め致します。
mam様 ありがとうございます。
とりあえずindy10をインストールしてみます。
そうですね。delphiのバージョンは古いと思います。
最新版を購入して今ある資産が動かなくならないか不安です。
よろしければそのあたりがどうなのか教えていただけないでしょうか。
私は趣味でDelphiを使っているだけなので、参考にはならないと思いますが、
新しいDelphiだと、今ある資産は動かなくなる可能性が非常に高いです。というか、全てコンパイル出来なくなると言っても過言ではありません。
まず、delphi2007のstringはShift-JISですが、Delphi2009以降はUCS2(UTF16LE)です。ここで大きな障壁となります。その他諸々対応しなければならないことも多数存在します。
また、バンドル製品やインターネットから有料無料のダウンロードして使っているライブラリやソースコード等も全て影響を受けますし、なかなか大変な事になると思います。
しかしながら、新しいDelphiによる恩恵も有るでしょうし、なにより、いずれは対応しなければならない事を先送りにして居るだけかもしれません。
少しずつ対応していくしかないのでは?と思います。
(私も先送りにしているフリーソフトがありますので、人のことは言えないです。)
mam様
そうですね。早い段階で新しいバージョンに切替えて少しづつ置き替えていくべきなのですね。
今回は着手が遅れてしまったのでindy10をインストールしてやってみます。
とても参考になりました。ありがとうございます。
ツイート | ![]() |