You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用双重验证与应用密码后Indy TIdSMTP连接Hotmail失败求助

解决Indy TIdSMTP/TIdIMAP4收发Hotmail邮件(双重验证+应用密码)的问题

SMTP发送配置要点

  • 必须启用显式TLS加密:Hotmail的SMTP 587端口要求使用STARTTLS,需为TIdSMTP绑定SSL IOHandler,并设置UseTLS为utUseExplicitTLS
  • 认证方式设为自动协商:不要硬指定Basic认证,设置AuthType := satDefault让Indy自动选择服务器支持的认证类型(应用密码兼容NTLM等认证方式)
  • 用生成的应用密码替换原密码,用户名保持你的Hotmail邮箱地址

SMTP完整示例代码

var
  SMTP: TIdSMTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  Msg: TIdMessage;
begin
  SMTP := TIdSMTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
  Msg := TIdMessage.Create(nil);
  try
    // SMTP核心配置
    SMTP.Host := 'smtp-mail.outlook.com';
    SMTP.Port := 587;
    SMTP.Username := '你的Hotmail邮箱@outlook.com';
    SMTP.Password := '你生成的应用密码'; // 注意:应用密码无需空格,直接填完整字符串
    SMTP.IOHandler := SSLHandler;
    SMTP.UseTLS := utUseExplicitTLS;
    SMTP.AuthType := satDefault; // 自动协商认证方式,避免强制Basic

    // 邮件内容配置
    Msg.From.Address := SMTP.Username;
    Msg.Recipients.Add.Address := '收件人邮箱@xxx.com';
    Msg.Subject := '测试邮件';
    Msg.Body.Text := '这是使用Indy+应用密码发送的测试邮件';

    // 发送邮件
    SMTP.Connect;
    try
      SMTP.Send(Msg);
      ShowMessage('邮件发送成功');
    finally
      SMTP.Disconnect;
    end;
  finally
    Msg.Free;
    SMTP.Free;
  end;
end;

IMAP接收配置要点

  • 端口推荐使用993(隐式TLS),也可使用143(显式TLS)
  • 需绑定SSL IOHandler,对应设置UseTLS(993端口用utUseImplicitTLS,143用utUseExplicitTLS)
  • 认证方式设为satDefault,密码使用生成的应用密码

IMAP4完整示例代码

var
  IMAP: TIdIMAP4;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  MailBox: TIdIMAP4MailBox;
begin
  IMAP := TIdIMAP4.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IMAP);
  try
    // IMAP核心配置
    IMAP.Host := 'imap-mail.outlook.com';
    IMAP.Port := 993;
    IMAP.Username := '你的Hotmail邮箱@outlook.com';
    IMAP.Password := '你生成的应用密码';
    IMAP.IOHandler := SSLHandler;
    IMAP.UseTLS := utUseImplicitTLS; // 993端口用隐式TLS
    IMAP.AuthType := satDefault;

    // 连接并读取收件箱
    IMAP.Connect;
    try
      IMAP.SelectMailBox('INBOX');
      MailBox := IMAP.MailBox;
      ShowMessage(Format('收件箱共有%d封邮件', [MailBox.TotalMsgs]));
      // 可在此添加读取邮件内容的逻辑
    finally
      IMAP.Disconnect;
    end;
  finally
    IMAP.Free;
  end;
end;

关键注意事项

  • 确保使用较新版本的Indy,旧版本可能对新认证机制支持不足
  • 应用密码生成后需妥善保存,丢失需重新生成
  • 不要在代码中硬编码密码,建议通过加密配置文件等安全方式存储

内容的提问来源于stack exchange,提问作者Moore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:30:07