Из предыдущего вопроса here Я узнал, как использовать INDY SMTP (TIdSMTP) для отправки писем с учетной записью Office 365. Я также понял это для многих других, и он работает практически для любого распространенного поставщика электронной почты. Но я не могу понять, как использовать его с моим локальным сервером Exchange. Некоторое время назад были компоненты SASL-NTLM, поставляемые с indy, но, похоже, они были удалены. Мне нужно, чтобы NTLM подключался к локальному серверу Exchange. Но я не могу понять, как это сделать без NTLM.Использование INDY 10 с Exchange SMTP-сервером
0
A
ответ
0
Я недавно боролся с Инди и моим сервером Exchange. Компонент SaslNtlm не входит в версию Indy10, поставляемую с Delphi XE5. Это даже не в исходных файлах папки Indy Protocols.
К счастью, имеется много вещей, необходимых для проверки подлинности NTLM с помощью SMTP-клиента. Существует единица под названием IdAuthenticationSSPI, которая реализует весь обмен NTLM. Все, что осталось сделать, это реализовать пользовательский потомок от TIdSASL, который взаимодействует с объектом TIndySSPINTLMClient.
TSaslNtlm = class(TIdSASL)
public
constructor Create(AOwner: TComponent);
destructor Destroy; override;
function StartAuthenticate(const AChallenge, AHost, AProtocolName : string): string; override;
function ContinueAuthenticate(const ALastResponse, AHost, AProtocolName : string): string; override;
function IsReadyToStart: Boolean; override;
class function ServiceName: TIdSASLServiceName; override;
private
FSSPIClient: TIndySSPINTLMClient;
end;
Реализация класса выглядит следующим образом:
constructor TSaslNtlm.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FSSPIClient := TIndySSPINTLMClient.Create;
end;
destructor TSaslNtlm.Destroy;
begin
FSSPIClient.Free;
inherited;
end;
function TSaslNtlm.StartAuthenticate(const AChallenge, AHost,
AProtocolName: string): string;
begin
FSSPIClient.SetCredentials(AHost, '', '');
Result := BytesToStringRaw(FSSPIClient.InitAndBuildType1Message);
end;
function TSaslNtlm.ContinueAuthenticate(const ALastResponse, AHost,
AProtocolName: string): string;
var LastMsg: TIdBytes;
begin
LastMsg := ToBytes(ALastResponse, Indy8BitEncoding
{$IFDEF STRING_IS_ANSI}, Indy8BitEncoding{$ENDIF});
Result := BytesToStringRaw(FSSPIClient.UpdateAndBuildType3Message(LastMsg));
end;
function TSaslNtlm.IsReadyToStart: Boolean;
begin
Result := True;
end;
class function TSaslNtlm.ServiceName: TIdSASLServiceName;
begin
Result := 'NTLM';
end;
А потом это просто вопрос добавления этого механизма SASL для клиента SMTP:
smtp.AuthType := satSASL;
ntml := TSaslNtlm.Create(smtp);
with smtp.SASLMechanisms.Add do begin
DisplayName := ntlm.ServiceName;
SASL := ntlm;
end;
Смежные вопросы
- 1. Delphi Использование Indy 10
- 2. Использование Indy 10 IdHTTP с TLS 1.2
- 3. Использование INDY 10 SMTP с Office365
- 4. Indy SMTP и Exchange Server
- 5. Indy TIdTCPServer TIdTCPClient data exchange
- 6. TIdHTTP in Indy 10
- 7. Indy 10 и OpenSSL
- 8. Indy 10 FTP пустой список
- 9. Indy 10 и sslvTLSv1_2
- 10. Indy 10 TidTCPServer кодирующие символы
- 11. Indy 10: Необъявленный идентификатор 'TIdBytes'
- 12. Почему Indy 10 не инициализируется?
- 13. Indy 10 для Delphi 7
- 14. Delphi 2007 & Обновленный Indy 10
- 15. Indy 10 повышение нежелательного исключения
- 16. Delphi XE3 indy 10 UDP
- 17. Delphi 7 Indy 10 ioHandler
- 18. Indy 10 Синхронизировать TIdTCPServer.onExecute с TIdSync
- 19. Восстановить почтовый ящик GMail с Indy 10
- 20. Indy 10 Метод TIdIMAP4 Извлечь проблему
- 21. Обновление Delphi 7 Indy 9 app to Indy 10 (II)
- 22. Использование файла cookie с Indy
- 23. В чем разница между Indy 9 и Indy 10?
- 24. Обновление Delphi 7 Indy 9 app. to Indy 10
- 25. Delphi Indy - Как получить SSL-сертификаты для SSL-TCP Client/Server ссылку с Indy 10
- 26. Delphi Indy 10 Вопрос о разъединении
- 27. Напишите Indy 10 из кодеков Delphi в C++ Builder Indy 10
- 28. Indy 10 TIdHttpServer отсутствует Свойство MaxConnectionReply
- 29. Indy 10 и опции гнезда для установки
- 30. Delphi 2005, невозможно построить Indy 10
Какие конкретные задачи у вас есть? Если вы не объясните, что такое «эта проблема», нам очень сложно дать советы о том, как ее исправить. Пожалуйста, отредактируйте свой вопрос и задайте более конкретный вопрос, чтобы мы могли попытаться помочь вам в его решении. –
Suppprt для NTLM SASL не был удален. В первую очередь это не было завершено. Компонент 'TIdSASLNTLM' по-прежнему существует в модуле' IdSASL_NTLM.pas', он по умолчанию не зарегистрирован на палитре компонентов, но вы можете его программировать в коде. –
@RemyLebeau: «IdSASL_NTLM.pas» не существует в моей версии INDY (Indy 10 поставляется с XE2). Я просто владею «IdNTLM.pas». {at} KenWhite: Я добавлю ошибки, которые получаю, когда буду использовать другие методы SALS (или просто не SASL) завтра, машина с сервером обмена не будет дома. – Timestop