Используйте SSL с Delphi, но у вас все еще есть один exe - PullRequest
8 голосов
/ 19 ноября 2009

Мы используем Indy и нам нужна поддержка SSL eMail в нашем приложении. Однако нам нужно иметь наше приложение в одном .Exe.

Мы знаем, что обработчик Indy по умолчанию требует, чтобы в пути были dll. Извлечение DLL из одного из ресурсов EXE будет последним средством.

Есть идеи получше?

Ответы [ 8 ]

8 голосов
/ 19 ноября 2009

Попробуйте SSLBlackBox .

4 голосов
/ 19 ноября 2009

Тондрей дал вам хороший ответ. Я также использую SecureBlackBox. Вы можете рассмотреть некоторые другие сторонние компоненты:

3 голосов
/ 19 ноября 2009

Помните: если вы добавите поддержку SSL / TLS в свой исполняемый файл, она может стать ограниченной для экспорта . Если вы находитесь в США, это может означать, что ваше приложение не может быть продано или передано людям за пределами США. Вот почему эти DLL не являются частью Indy или Delphi.

Библиотеки, которые использует Delphi, на самом деле являются скомпилированными DLL из проекта OpenSSL . Но если вы хорошо разбираетесь в C, тогда вы сможете скомпилировать исходный код в файлы .obj и вместо этого связать их с вашим кодом Delphi. Возможно, вам придется изменить часть кода Indy для этого тоже. Конечно, другие тоже могли бы сделать это, но это усложняет экспорт этих компонентов Indy (или даже самого Delphi) из-за этих ограничений на экспорт.

Как ни странно, исходный код защищен первой поправкой, которая в основном позволяет напечатать код в книге, а затем отправить его какой-то стране-изгою. Хотя, если вы отправите его в цифровом виде (скомпилировано или нет), то вы совершаете федеральное преступление и, вероятно, должны будете быть осторожны, собирая мыло в душе, по крайней мере, год ... законы имеют смысл. Они могут быть просто болью в звуковом сигнале ...

Другие решения SSL не работают вместе с компонентами Indy, что означает, что вам придется переписывать часть своего кода для поддержки этих других решений.


Эта ссылка рассказывает, как вы можете загрузить DLL из памяти, поэтому вам не нужно иметь ее на диске. Это альтернативное решение, которое я не пробовал. Я не думаю, что это будет работать, так как две библиотеки DLL зависят друг от друга, но, возможно, стоит попробовать ...
2 голосов
/ 18 сентября 2013

Вы пытались самостоятельно скомпилировать исходный код OpenSLL и импортировать объектные файлы в Delphi?

Рекомендуемое прочтение: Использование объектных файлов C в Delphi - объясняется, как создать программу, которая не нуждается в DLL и может быть развернута за один раз

2 голосов
/ 19 ноября 2009

Требуется ли «Один 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, неправильно отформатирован и т. Д., Но должен дать вам основную идею.

1 голос
/ 19 ноября 2009

Я использую CAPICOM от Microsoft для SSl3, и он решил мои потребности ... Он свободно распространяется , но прекращен

Если вы попробуете другие компоненты, возможно, вам стоит обратить внимание на SYNAPSE (на http://synapse.ararat.cz/) (я также использую)), он может работать с StreamSec (и другими) для отправки электронных писем через ssl. Это бесплатно и легко для работы.

0 голосов
/ 19 ноября 2009

Можно включить эти библиотеки DLL в исполняемый файл программы в качестве ресурсов и либо экспортировать их в файлы, когда они используются, либо даже использовать их, не экспортируя их вначале, перемещая код и ища точки входа в памяти. У меня где-то есть код для выполнения последнего ....

0 голосов
/ 19 ноября 2009

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;  

...