9

Indyを使用しており、アプリでSSL電子メールサポートが必要です。ただし、アプリケーションを1つの.Exeに含める必要があります。

デフォルトのIndyハンドラーでは、パスにdllが含まれている必要があることがわかっています。EXEのリソースの1つからDLLを抽出することが、最後の手段になります。

より良いアイデアはありますか?

4

8 に答える 8

8

SSLBlackBoxを試してください。

于 2009-11-19T11:01:16.003 に答える
5

TOndrey が適切な回答をくれました。私もSecureBlackBoxを使っています。他のサードパーティ コンポーネントを検討することもできます。

于 2009-11-19T14:14:11.890 に答える
3

注意:実行可能ファイル内にSSL / TLSサポートを追加すると、エクスポートが制限される可能性があります。米国にいる場合、これは、アプリケーションを米国外の人に販売または提供できないことを意味する場合があります。これが、これらのDLLがIndyまたはDelphi自体の一部ではない理由です。

Delphiが使用するライブラリは、実際にはOpenSSLプロジェクトからコンパイルされたDLLです。ただし、Cについて十分な知識がある場合は、ソースを.objファイルにコンパイルして、代わりにDelphiコードにリンクできるはずです。このためにも、おそらくIndyコードの一部を変更する必要があります。もちろん、他の人もこれを行うことができたかもしれませんが、それらのエクスポート制限のために、それらのIndyコンポーネント(またはDelphi自体)のエクスポートがより複雑になります。

おかしなことに、ソースコードは最初の修正によって保護されています。これにより、基本的にコードを本に印刷して、不正な国に送信することができます。あなたがそれをデジタル形式(コンパイルされているかどうかにかかわらず)で送るなら、あなたは連邦犯罪を犯しているので、少なくとも1年間シャワーで石鹸を拾うときはおそらく注意しなければならないでしょう...誰もそれを主張しませんでした法律は理にかなっています。彼らは[ビープ音]の痛みになる可能性があります...

他のSSLソリューションはIndyコンポーネントと連携しません。つまり、これらの他のソリューションをサポートするには、コードの一部を書き直す必要があります。


このリンクは、メモリからDLLをロードする方法を示しているため、ディスク上にDLLを置く必要はありません。これは私が試したことのない代替ソリューションです。2つのDLLは相互に依存しているため、機能しないと思いますが、試してみる価値があるかもしれません...

于 2009-11-19T13:12:28.300 に答える
2

"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、適切にフォーマットされていないなどですが、基本的な考え方は理解できるはずです。

于 2009-11-19T12:14:27.603 に答える
1

Microsoft の CAPICOM を SSl3 に使用していますが、これで私のニーズは解決されました...自由に再配布できますが、廃止されました

他のコンポーネントを試す場合は、SYNAPSE ( http://synapse.ararat.cz/ ) を参照する必要があります (私も使用しています)、StreamSec (およびその他) と連携して SSL 経由でメールを送信できます。無料で働きやすい。

于 2009-11-19T16:57:43.820 に答える
0

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;  

于 2009-11-19T12:38:02.297 に答える
0

これらの DLL をプログラムの実行可能ファイルにリソースとして含め、使用時にファイルにエクスポートすることも、コードを再配置してメモリ内のエントリ ポイントを検索することにより、最初にエクスポートせずに使用することもできます。私は後者を行うためのコードをどこかに持っています....

于 2009-11-19T17:27:53.027 に答える