【问题标题】:Error sending email using CDO on port 587 (TLS)在端口 587 (TLS) 上使用 CDO 发送电子邮件时出错
【发布时间】:2017-12-14 00:52:41
【问题描述】:

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

这是我的 C++ 代码:

CDO::IMessagePtr iMsg(__uuidof(CDO::Message));
CDO::IConfigurationPtr iConf = iMsg->GetConfiguration();
CDO::FieldsPtr iFields;
_bstr_t empty("");
iConf->Load(CDO::cdoIIS,empty);  // this string constant from import
iFields = iConf->Fields;

iFields->Item["https://schemas.microsoft.com/cdo/configuration/smtpserver"]->Value = _variant_t(szServer);
iFields->Item["https://schemas.microsoft.com/cdo/configuration/smtpserverport"]->Value    = _variant_t(587);
iFields->Item["https//schemas.microsoft.com/cdo/configuration/sendusing"]->Value           = 2;
iFields->Item["https//schemas.microsoft.com/cdo/configuration/smtpauthenticate"]->Value = _variant_t(1); // Basic
iFields->Item["https//schemas.microsoft.com/cdo/configuration/sendusername"]->Value    = _variant_t(szUser);
iFields->Item["https//schemas.microsoft.com/cdo/configuration/sendpassword"]->Value     = _variant_t(szPassword);

if(iUseSSLTLS == 2)
    iFields->Item["https//schemas.microsoft.com/cdo/configuration/sendtls"]->Value = _variant_t(true);
else
    iFields->Item["https//schemas.microsoft.com/cdo/configuration/smtpusessl"]->Value = _variant_t(true);

iFields->Update();
etc... etc...

如果我将此代码与smtp.gmail.com 一起使用:

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

我收到以下回复:

  • 代码 = 8004020e,
  • 代码含义 = Impossibile modificare o eliminare un oggetto che è stato aggiunto utilizzando COM+ Admin SDK,
  • 来源 = (null),
  • 描述 = Indirizzo del mittente respinto dal 服务器。 Risposta del 服务器:530 5.7.0 必须先发出 STARTTLS 命令。 y2sm3575389wme.12 - gsmtp,

(对不起...部分信息是意大利语,但请看一下粗体/斜体)

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

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

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

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


我最终将smtpusesslsendtls 一起尝试,将它们设置为true:

iFields->Item["https//schemas.microsoft.com/cdo/configuration/sendtls"]->Value = _variant_t(true);
iFields->Item["https//schemas.microsoft.com/cdo/configuration/smtpusessl"]->Value = _variant_t(true);

我得到以下错误:

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

【问题讨论】:

  • 很确定 smtpusessl 也需要为 TLS 开启
  • 你说吗? iFields->Item[... /sendtls"]->Value = _variant_t(true); iFields->Item[... /smtpusessl"]->Value = _variant_t(true);在一起吗?
  • 不,我尝试 smtpusessl 和 sendtls 一起,将它们设置为 true,我得到以下错误:代码 = 80040213 代码含义 = IDispatch 错误 #19 源 = CDO.Message.1 描述 = 传输失败连接到服务器。

标签: c++ email cdo.message


【解决方案1】:

两年多后,我找到了解决方案,嗯……不是解决方案,但现在我知道为什么它不起作用,为什么它永远不会起作用。 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

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

【讨论】:

    猜你喜欢
    • 2017-07-11
    • 2013-06-25
    • 2015-06-16
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 2012-11-11
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多