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

时间:2017-07-10 10:18:30

标签: c++ email cdo

是否有任何技巧可以在端口587上使用CDO发送邮件(端口使用TLS安全协议)。这是我的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->更新(); 等......等等...... 如果我将此代码用于stmp.gmail.com:

  • 服务器:smtp.gmail.com,
  • port:587,
  • sndtls = true,
  • 帐户:我的Gmail帐户,
  • 密码:

我得到以下回复:

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

(抱歉......部分信息是用意大利语写的,但请看一下粗体/斜体) 显然,如果我使用相同的参数配置Outlook 2010,它可以很好地工作。还有一件事,如果我使用端口465和SSL:

  • 服务器:smtp.gmail.com,
  • port:465,
  • smtpusessl = true,
  • 帐户:我的Gmail帐户,
  • 密码:

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

我最终尝试了smtpusessl和sendtls,将它们设置为真:

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
  • Source = CDO.Message.1
  • 描述=传输无法连接到服务器。

感谢。

1 个答案:

答案 0 :(得分:1)

经过2年多的时间,我找到了解决方案,好吧……不是解决方案,但是现在我知道了为什么它不起作用,以及为什么它永远不起作用。看来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”或第三方组件。