Indyを使用しており、アプリでSSL電子メールサポートが必要です。ただし、アプリケーションを1つの.Exeに含める必要があります。
デフォルトのIndyハンドラーでは、パスにdllが含まれている必要があることがわかっています。EXEのリソースの1つからDLLを抽出することが、最後の手段になります。
より良いアイデアはありますか?
SSLBlackBoxを試してください。
TOndrey が適切な回答をくれました。私もSecureBlackBoxを使っています。他のサードパーティ コンポーネントを検討することもできます。
注意:実行可能ファイル内にSSL / TLSサポートを追加すると、エクスポートが制限される可能性があります。米国にいる場合、これは、アプリケーションを米国外の人に販売または提供できないことを意味する場合があります。これが、これらのDLLがIndyまたはDelphi自体の一部ではない理由です。
Delphiが使用するライブラリは、実際にはOpenSSLプロジェクトからコンパイルされたDLLです。ただし、Cについて十分な知識がある場合は、ソースを.objファイルにコンパイルして、代わりにDelphiコードにリンクできるはずです。このためにも、おそらくIndyコードの一部を変更する必要があります。もちろん、他の人もこれを行うことができたかもしれませんが、それらのエクスポート制限のために、それらのIndyコンポーネント(またはDelphi自体)のエクスポートがより複雑になります。
おかしなことに、ソースコードは最初の修正によって保護されています。これにより、基本的にコードを本に印刷して、不正な国に送信することができます。あなたがそれをデジタル形式(コンパイルされているかどうかにかかわらず)で送るなら、あなたは連邦犯罪を犯しているので、少なくとも1年間シャワーで石鹸を拾うときはおそらく注意しなければならないでしょう...誰もそれを主張しませんでした法律は理にかなっています。彼らは[ビープ音]の痛みになる可能性があります...
他のSSLソリューションはIndyコンポーネントと連携しません。つまり、これらの他のソリューションをサポートするには、コードの一部を書き直す必要があります。
"Single EXE" の要件は配布目的ですか、それともクライアントのマシンで実行する場合は単一の .EXE ファイルでなければなりませんか?
配布目的のみの場合は、DLL ファイルを .EXE ファイルの末尾に追加し、プログラムの起動時に .EXE ファイルからそれらを抽出して、次のように .DLL ファイルとしてローカルに保存できます。
VAR F,O : FILE;
VAR BUF : ARRAY[1..<MaxSizeOfDLLs>] OF BYTE;
ASSIGN(F,ParamStr(0)); RESET(F,1);
SEEK(F,<OriginalExeSize>);
BLOCKREAD(F,BUF,<FirstDllSize>);
ASSIGN(O,<NameOfFirstDLL>); REWRITE(O,1);
BLOCKWRITE(O,BUF,<FirstDllSize>); CLOSE(O);
BLOCKREAD(F,BUF,<SecondDllSize>);
ASSIGN(O,<NameOfSecondDLL>); REWRITE(O,1);
BLOCKWRITE(O,BUF,<SecondDllSize>); CLOSE(O);
SEEK(F,<OriginalExeSize>); TRUNCATE(F); CLOSE(F)
Quick'n'Dirty、適切にフォーマットされていないなどですが、基本的な考え方は理解できるはずです。
Microsoft の CAPICOM を SSl3 に使用していますが、これで私のニーズは解決されました...自由に再配布できますが、廃止されました
他のコンポーネントを試す場合は、SYNAPSE ( http://synapse.ararat.cz/ ) を参照する必要があります (私も使用しています)、StreamSec (およびその他) と連携して SSL 経由でメールを送信できます。無料で働きやすい。
Const
cdoSendUsingMethod = 'http://schemas.microsoft.com/cdo/configuration/sendusing';
cdoSMTPServer = 'http://schemas.microsoft.com/cdo/configuration/smtpserver';
cdoSMTPServerPort = 'http://schemas.microsoft.com/cdo/configuration/smtpserverport';
cdoSendServerPort = '25';
cdoSendUsingPort = 2;
cdoSMTPConnectionTimeout = 'http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout';
cdoSMTPAuthenticate = 'http://schemas.microsoft.com/cdo/configuration/smtpauthenticate';
cdoAnonymous = '0';
cdoBasic = '1';
cdoSMTPUseSSL = 'http://schemas.microsoft.com/cdo/configuration/smtpusessl';
cdoSendUserName = 'http://schemas.microsoft.com/cdo/configuration/sendusername';
cdoSendPassword = 'http://schemas.microsoft.com/cdo/configuration/sendpassword';
cdoURLGetLatestVersion = 'http://schemas.microsoft.com/cdo/configuration/urlgetlatestversion';
...
function SensCDOMail (ASubject, AFrom, ATo, ABody, ASmtpServer : WideString): String;
var
cdoMessage:OleVariant;
cdoConfiguration: OleVariant;
begin
//Configuration Object
cdoMessage:= CreateOleObject('CDO.Message');
cdoConfiguration:= CreateOleObject('CDO.Configuration');
try
cdoConfiguration.Fields(cdoSendUsingMethod):= cdoSendUsingPort;
cdoConfiguration.Fields(cdoSMTPServer):= ASmtpServer;
cdoConfiguration.Fields(cdoSMTPServerPort):= cdoSendServerPort;
cdoConfiguration.Fields(cdoSMTPAuthenticate):= cdoAnonymous;
cdoConfiguration.Fields(cdoSMTPUseSSL ):= True; // use SSL
cdoConfiguration.Fields.Update;
cdoMessage.Configuration:= cdoConfiguration;
cdoMessage.To := ATo;
cdoMessage.From := AFrom;
cdoMessage.Subject := ASubject;
//cdoMessage.HTMLBody := ABody; //Want to send in Html format
cdoMessage.TextBody := ABody; //Want to send in text format
cdoMessage.Send;
finally
VarClear(cdoMessage);
VarClear(cdoConfiguration);
end;
end;
これらの DLL をプログラムの実行可能ファイルにリソースとして含め、使用時にファイルにエクスポートすることも、コードを再配置してメモリ内のエントリ ポイントを検索することにより、最初にエクスポートせずに使用することもできます。私は後者を行うためのコードをどこかに持っています....