Ошибка сокета Indy 10 11001 Хост не найден - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь отправить электронное письмо, используя Indy 10.5.7 на C ++ Builder XE, но получаю сообщение об ошибке Host not found. Я добавил компоненты TIdSMTP, TIdSSLIOHandlerSocketOpenSSL и TIdMessage. Я установил хост на smtp.office365.com, порт на 587 и UseTLS на utUseExplicitTLS. Имя пользователя и пароль установлены для адреса электронной почты учетной записи, с которой мне нужно связаться.

Я пытаюсь отправить электронное письмо, используя:

IdMessage1->From->Name = Name->Text;
IdMessage1->From->Address = EmailAddress->Text;
IdMessage1->Body = Msg->Lines;

try
{
    IdSMTP1->Connect(1000);
    try
    {
        IdSMTP1->Send(IdMessage1);
    }
    __finally
    {
        IdSMTP1->Disconnect();
    }
}
catch (const Exception &E)
{
    MessageBox(NULL, E.Message.c_str(), L"Error", MB_OK | MB_ICONERROR);
}

1 Ответ

0 голосов
/ 19 октября 2019

Эта строка неверна:

IdSMTP1->Connect(1000);

В Indy 9, Connect() имел перегрузку, которая приняла тайм-аут в качестве входа. Но в Indy 10 эта перегрузка была удалена, а параметр timeout был переопределён как свойство ConnectTimeout.

Ваш исходный код компилируется, потому что Connect() в Indy 10 имеет перегрузку, которая принимает имя хоста Stringв качестве ввода перезаписывается свойство Host, а (Ansi|Unicode)String имеет конструктор, который принимает int в качестве ввода. Таким образом, ваш код эффективно выполняет это

IdSMTP1->Connect(String(1000));

, которое пытается подключиться к имени хоста с именем "1000", игнорируя имя хоста "smtp.office365.com", которое вы присвоили свойству Host. Вот почему вы получаете сокет с ошибкой 11001.

Вам нужно заменить неправильную строку следующим кодом:

//IdSMTP1->Connect(1000);
IdSMTP1->ConnectTimeout = 1000;
IdSMTP1->Connect();
...