TransWikia.com

Как подключить прокси при отправке сообщения на почту

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. Вот в этом и проблема.

One Answer

Вот пример настройки 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):

  • для http прокси: SetupHttpTransparentProxy(SSLOpen, @VProxyInfo);
  • для socks прокси: SetupSocksTransparentProxy(SSLOpen, @VProxyInfo);

где, VProxyInfo: TProxyInfo; - параметры прокси.

Answered by zed on December 4, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP