【问题标题】:Indy 10 socket error 11001 Host not foundIndy 10 套接字错误 11001 找不到主机
【发布时间】:2019-10-15 05:15:09
【问题描述】:

我尝试在 C++ Builder XE 上使用 Indy 10.5.7 发送电子邮件,但我收到 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);
}

【问题讨论】:

  • 我尝试升级,但由于我的 c++ builder 版本是 starter,我无法编译。我可以使用“mjfreelancing.com/…”上的预构建版本来升级 Indy 吗?
  • 我没有使用入门版,您在编译时遇到什么问题?看起来 MJ 的预编译二进制文件不是最新的,更不用说过去几年支持现代 IDE 版本了。
  • 它说'这个版本的产品不支持命令行编译'。
  • 在这种情况下,要更新 Indy,您可能必须将 Indy 的源文件直接添加到您的项目中。或者,为 Indy 创建自己的 C++Builder 项目文件并在 IDE 中编译它。 Indy 多年前就停止提供本地 C++Builder 项目文件,因为 Delphi 项目文件可以在 C++Builder 的命令行上编译。 Indy 没有考虑到入门版中缺少命令行编译(事实上,直到现在我才意识到这个限制)。
  • 我将源文件复制到我的项目中并编译了我的项目。我仍然收到同样的错误,你知道这可能是什么原因吗,其他所有东西都可以连接到互联网。

标签: c++builder indy


【解决方案1】:

这一行是错误的:

IdSMTP1->Connect(1000);

在 Indy 9 中,Connect() 具有接受超时作为输入的过载。但在 Indy 10 中,这种重载被移除了,超时参数被重新实现为 ConnectTimeout 属性。

您的原始代码可以编译,因为 Indy 10 中的 Connect() 具有将主机名 String 作为输入的重载,覆盖了 Host 属性,并且 (Ansi|Unicode)String 有一个接受 int 作为输入的构造函数。因此,您的代码有效地做到了这一点

IdSMTP1->Connect(String(1000));

它尝试连接到名为 "1000" 的主机名,忽略您分配给 Host 属性的 "smtp.office365.com" 主机名。这就是您收到套接字错误 11001 的原因。

您需要用此代码替换有问题的行:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    相关资源
    最近更新 更多