Stack Overflow на русском Asked on December 4, 2021
Как подключить прокси при отправке сообщения на почту?.
Вот код отправки сообщения:
procedure TMainForm.ButtonSendClick(Sender: TObject);
var
SMTP : TIdSMTP;
msg : TIdMessage;
SSLOpen : TIdSSLIOHandlerSocketOpenSSL;
begin
// Вот тут подключаю прокси //////////
IdSMTP1.IOHandler := IdIOHandlerStack1;
IdIOHandlerStack1.TransparentProxy := IdConnectThroughHttpProxy1;
IdConnectThroughHttpProxy1.Host := '14.198.177.46';
IdConnectThroughHttpProxy1.Port := StrToInt('8080');
// Вот тут подключаю прокси //////////
SMTP := TIdSMTP.Create(Application);
SMTP.Host := 'smtp.yandex.ru';
SMTP.Port := 465;
SMTP.AuthType := satDefault;
SMTP.Username := '[email protected]';{Должно совпадать с msg.From.Address}
SMTP.Password := 'yourpassword';
//это необходимо использовать для SSL
SSLOpen := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
SSLOpen.Destination := SMTP.Host+':'+IntToStr(SMTP.Port);
SSLOpen.Host := SMTP.Host;
SSLOpen.Port := SMTP.Port;
SSLOpen.DefaultPort := 0;
SSLOpen.SSLOptions.Method := sslvSSLv23;
SSLOpen.SSLOptions.Mode := sslmUnassigned;
SMTP.IOHandler := SSLOpen;
SMTP.UseTLS := utUseImplicitTLS;
msg := TIdMessage.Create(Application);
msg.ContentType:='text/html; charset=windows-1251';
msg.Body.Text:='Привет из Delphi';
msg.Subject := 'Проверка почты';
msg.From.Address := '[email protected]'; {<<Должно совпадать с SMTP.UserName}
msg.From.Name := 'YourName';
msg.Recipients.EMailAddresses :='[email protected]';
SMTP.Connect;
if SMTP.Connected then
begin
SMTP.Send(msg);
ShowMessage ('Сообщение отправлено');
end else
ShowMessage ('Не удалось отправить сообщение');
SMTP.Disconnect();
SMTP.Free;
msg.Free;
end;
Рассылка то идет но не через Proxy. Вот в этом и проблема.
Вот пример настройки http/socks прокси:
uses
IdSocks,
IdIOHandlerSocket,
IdConnectThroughHttpProxy;
type
TProxyType = (
ptNone,
ptHttp,
ptSocks4,
ptSocks4A,
ptSocks5
);
TProxyInfo = record
PType : TProxyType;
Host : string;
Port : Word;
Username : string;
Password : string;
end;
PProxyInfo = ^TProxyInfo;
procedure SetupHttpTransparentProxy(
const AIOHandler: TIdIOHandlerSocket;
const AProxyInfo: PProxyInfo
);
var
VHttpProxy: TIdConnectThroughHttpProxy;
begin
VHttpProxy := TIdConnectThroughHttpProxy.Create(AIOHandler);
VHttpProxy.Host := AProxyInfo.Host;
VHttpProxy.Port := AProxyInfo.Port;
VHttpProxy.Username := AProxyInfo.Username;
VHttpProxy.Password := AProxyInfo.Password;
AIOHandler.TransparentProxy := VHttpProxy;
AIOHandler.TransparentProxy.Enabled := True;
end;
procedure SetupSocksTransparentProxy(
const AIOHandler: TIdIOHandlerSocket;
const AProxyInfo: PProxyInfo
);
var
VSocksProxy: TIdSocksInfo;
begin
VSocksProxy := TIdSocksInfo.Create(AIOHandler);
try
case AProxyInfo.PType of
ptSocks4: VSocksProxy.Version := svSocks4;
ptSocks4A: VSocksProxy.Version := svSocks4A;
ptSocks5: VSocksProxy.Version := svSocks5;
else
raise Exception.Create(
'Unknown SOCKS proxy type: ' + IntToStr(Integer(AProxyInfo.PType))
);
end;
VSocksProxy.Host := AProxyInfo.Host;
VSocksProxy.Port := AProxyInfo.Port;
if AProxyInfo.Username <> '' then begin
VSocksProxy.Authentication := saUsernamePassword;
VSocksProxy.Username := AProxyInfo.Username;
VSocksProxy.Password := AProxyInfo.Password;
end else begin
VSocksProxy.Authentication := saNoAuthentication;
end;
AIOHandler.TransparentProxy := VSocksProxy;
VSocksProxy := nil;
AIOHandler.TransparentProxy.Enabled := True;
finally
VSocksProxy.Free;
end;
end;
Использовать так (вызвать перед строчкой SMTP.IOHandler := SSLOpen
):
SetupHttpTransparentProxy(SSLOpen, @VProxyInfo);
SetupSocksTransparentProxy(SSLOpen, @VProxyInfo);
где, VProxyInfo: TProxyInfo;
- параметры прокси.
Answered by zed on December 4, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP