Как решить «неверный адрес» с помощью idSMTP - PullRequest
0 голосов
/ 30 марта 2020

Я опубликовал различные вопросы, пытаясь выяснить все мои проблемы с попыткой отправить электронное письмо с использованием TLS с Office365.

Мой последний вопрос здесь: Как мне решить [EIdSMTPReplyError] Аутентификация не удалась ?

Так как я не мог решить последнее, я получил учетные данные одного из наших клиентов и попробовал проверить образец с их служебными учетными данными, что приблизило меня на один шаг. С моими офисными учетными данными я просто не могу пройти аутентификацию (см. Предыдущую ссылку). В PowerShell нет проблем, и я могу отправить электронное письмо с теми же учетными данными, но не программно.

Я сейчас пытаюсь выяснить, почему сервер возвращает «Неверный адрес», используя учетные данные клиента. Опять же, я могу использовать те же учетные данные в PowerShell и создать образец электронного письма, которое работает. Но не с этим компонентом.

Слегка скорректированный код из предыдущей ссылки:

procedure TForm28.SendEmail(poSMTP:TIdSMTP);
var
  loSMTPMessage   : TIdMessage;

begin
  loSMTPMessage := TIdMessage.Create(nil);
  with loSMTPMessage do
  begin
    Recipients.Add.Address := 'to address';
    ReplyTo.Add.Text  := edtUsername.Text;
    From.Address := edtUsername.Text;
    From.Name    := 'xxx';
    From.Text    := 'Test';
    Subject      := 'Test';
  end;
  poSMTP.Send(loSMTPMessage);
  loSMTPMessage.Free;
end;

procedure TForm28.Method2Click(Sender: TObject);
var
  idSMTP1: TIdSMTP;
  idSASLLogin: TIdSASLLogin;
  idUserPassProvider: TIdUserPassProvider;
  lp:PWideChar;
  liSize:Cardinal;

begin
  idSMTP1 := TIdSMTP.Create(nil);
  idSMTP1.OnFailedRecipient := IdSMTP1FailedRecipient;

   //have tried all these variations in trying to solve authentication issue

//  IdSMTP1.HeloName := GetComputerNameExString(ComputerNameNetBIOS);
//  IdSMTP1.HeloName := GetComputerNameExString(ComputerNameDnsHostname);
//  IdSMTP1.HeloName := GetComputerNameExString(ComputerNameDnsDomain);
//  IdSMTP1.HeloName := GetComputerNameExString(ComputerNamePhysicalNetBIOS);
//  IdSMTP1.HeloName := GetComputerNameExString(ComputerNamePhysicalDnsHostname);
//  IdSMTP1.HeloName := GetComputerNameExString(ComputerNamePhysicalDnsDomain);
//  IdSMTP1.HeloName := GetComputerNameExString(ComputerNamePhysicalDnsFullyQualified);
//  IdSMTP1.HeloName := GetComputerNameExString(ComputerNameMax);  

  try
    idSMTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(idSMTP1);
    idSMTP1.UseTLS := utUseExplicitTLS;
    TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];

    idSMTP1.Host := edtSMTP.Text;
    idSMTP1.Port := StrToInt(cbPort.Text);

    idSASLLogin := TIdSASLLogin.Create(idSMTP1);
    idUserPassProvider := TIdUserPassProvider.Create(idSASLLogin);

    idSASLLogin.UserPassProvider := idUserPassProvider;
    idUserPassProvider.Username := edtUsername.Text;
    idUserPassProvider.Password := edtPassword.Text;

    idSMTP1.AuthType := satSASL;
    idSMTP1.SASLMechanisms.Add.SASL := idSASLLogin;

    try
      idSMTP1.Connect;
      try
        if idSMTP1.Authenticate then
          SendEmail(idSMTP1);
      finally
        idSMTP1.Disconnect;
      end;
      ShowMessage('OK');
    except
      on E: Exception do
      begin
        ShowMessage(Format('Failed!'#13'[%s] %s', [E.ClassName, E.Message]));
        raise;
      end;
    end;
  finally
    idSMTP1.Free;
  end;
end;

Это вызывает ошибку: Project SMTP_SSL_Example.exe вызвал класс исключения EIdSMTPReplyError с сообщением «Неверный адрес».

1 Ответ

1 голос
/ 30 марта 2020

О, мой gosh.

From.Text    := 'Test';

вызвано после того, как

From.Address := edtUsername.Text

изменил мой адрес электронной почты на «тест». Не могу поверить, что я потратил время на что-то глупое, подобное этому.

...