在端口 587 (TLS) 上使用 CDO 发送电子邮件时出错

Pao*_*lia 3 c++ email cdo.message

在端口 587(使用 TLS 安全协议的端口)上使用 CDO 发送邮件有什么技巧吗?

\n

这是我的 C++ 代码:

\n
CDO::IMessagePtr iMsg(__uuidof(CDO::Message));\nCDO::IConfigurationPtr iConf = iMsg->GetConfiguration();\nCDO::FieldsPtr iFields;\n_bstr_t empty("");\niConf->Load(CDO::cdoIIS,empty);  // this string constant from import\niFields = iConf->Fields;\n\niFields->Item["https://schemas.microsoft.com/cdo/configuration/smtpserver"]->Value = _variant_t(szServer);\niFields->Item["https://schemas.microsoft.com/cdo/configuration/smtpserverport"]->Value    = _variant_t(587);\niFields->Item["https//schemas.microsoft.com/cdo/configuration/sendusing"]->Value           = 2;\niFields->Item["https//schemas.microsoft.com/cdo/configuration/smtpauthenticate"]->Value = _variant_t(1); // Basic\niFields->Item["https//schemas.microsoft.com/cdo/configuration/sendusername"]->Value    = _variant_t(szUser);\niFields->Item["https//schemas.microsoft.com/cdo/configuration/sendpassword"]->Value     = _variant_t(szPassword);\n\nif(iUseSSLTLS == 2)\n    iFields->Item["https//schemas.microsoft.com/cdo/configuration/sendtls"]->Value = _variant_t(true);\nelse\n    iFields->Item["https//schemas.microsoft.com/cdo/configuration/smtpusessl"]->Value = _variant_t(true);\n\niFields->Update();\netc... etc...\n
Run Code Online (Sandbox Code Playgroud)\n

如果我将此代码与以下内容一起使用smtp.gmail.com

\n
    \n
  • 服务器:smtp.gmail.com,
  • \n
  • 端口:587,
  • \n
  • sndtls = 真,
  • \n
  • 帐户:我的 Gmail 帐户,
  • \n
  • 密码:
  • \n
\n

我得到以下回复:

\n
    \n
  • 代码=8004020e,
  • \n
  • 代码含义 = 无法修改或取消 oggetto che \xc3\xa8 stato aggiunto utilizzando COM+ Admin SDK,
  • \n
  • 来源=(空),
  • \n
  • 描述 = Indirizzo del mittente respinto dal 服务器。Risposta del 服务器:530 5.7.0必须首先发出 STARTTLS 命令。y2sm3575389wme.12 - gsmtp,
  • \n
\n

(抱歉...部分消息是意大利语,但请看一下粗体/斜体的消息)

\n

显然,如果我使用相同的参数配置 Outlook 2010,它会完美运行。

\n

还有一件事,如果我使用端口 465 和 SSL:

\n
    \n
  • 服务器:smtp.gmail.com,
  • \n
  • 端口:465,
  • \n
  • smtpusessl=真,
  • \n
  • 帐户:我的 Gmail 帐户,
  • \n
  • 密码:
  • \n
\n

代码工作正常,但我需要配置 587 端口和 TLS。

\n
\n

我最终尝试smtpusesslsendtls一起,将它们变为现实:

\n
iFields->Item["https//schemas.microsoft.com/cdo/configuration/sendtls"]->Value = _variant_t(true);\niFields->Item["https//schemas.microsoft.com/cdo/configuration/smtpusessl"]->Value = _variant_t(true);\n
Run Code Online (Sandbox Code Playgroud)\n

我收到以下错误:

\n
    \n
  • 代码=80040213
  • \n
  • 代码含义 = IDispatch 错误 #19
  • \n
  • 来源 = CDO.Message.1
  • \n
  • 描述 = 传输无法连接到服务器。
  • \n
\n

Pao*_*lia 10

两年多后,我找到了一个解决方案,嗯……不是一个解决方案,但现在我知道为什么它不起作用,或者为什么它永远不会起作用。CDO 库似乎存在一个错误:它可以在端口 25 上处理 STARTTLS 命令,但不能在端口 587 上处理。

您可以在此处阅读更多信息: https://social.technet.microsoft.com/Forums/en-US/37d00342-e5e9-4c8d-975d-44362332d426/bug-in-cdomessage-smtpserverport-587-fails ?forum=ITCG

正如我上面刚刚写的,这是一个错误,我认为微软永远不会纠正它。未来的建议是放弃 CDO 并使用“Power shell”或第三方组件。