Ошибка отправки электронной почты с использованием CDO на порт 587 (TLS)

есть ли какой-нибудь трюк для отправки почты с CDO на порт 587 (порт использует протокол безопасности 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,
  • порт: 587,
  • sndtls = истина,
  • аккаунт: моя учетная запись Gmail,
  • пароль:

Получаю такой ответ:

  • Код = 8004020e,
  • Значение кода = Невозможно изменить или удалить некорректный результат, который уже был обновлен с помощью COM + Admin SDK,
  • Источник = (ноль),
  • Описание = Indirizzo del mittente respinto dal server. Сообщение сервера: 530 5.7.0 Сначала необходимо ввести команду STARTTLS. y2sm3575389wme.12 - gsmtp,

(извините ... часть сообщения на итальянском языке, но обратите внимание на полужирный / курсив) Очевидно, что если я настрою Outlook 2010 с теми же параметрами, он будет работать отлично. Еще одна вещь, если я использую порт 465 и SSL:

  • сервер: smtp.gmail.com,
  • порт: 465,
  • smtpusessl = истина,
  • аккаунт: моя учетная запись Gmail,
  • пароль:

код работает нормально, но мне нужно настроить порт 587 и TLS.


В конце концов я попробовал smtpusessl и sendtls вместе, установив их 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
  • Описание = Транспортному транспорту не удалось подключиться к серверу.

Спасибо.


person Paolo Branzaglia    schedule 10.07.2017    source источник
comment
Я уверен, что smtpusessl также должен быть включен для TLS   -  person Alex K.    schedule 10.07.2017
comment
Вы меня видите; iFields- ›Item [... / sendtls] -› Value = _variant_t (true); iFields- ›Item [... / smtpusessl] -› Value = _variant_t (true); вместе?   -  person Paolo Branzaglia    schedule 10.07.2017
comment
нет, я попробовал smtpusessl и sendtls вместе, установив их в значение true, и я получил следующую ошибку: Код = 80040213 Значение кода = ошибка IDispatch # 19 Источник = CDO.Message.1 Описание = Транспортному транспорту не удалось подключиться к серверу.   -  person Paolo Branzaglia    schedule 10.07.2017
comment


Ответы (1)


Спустя более 2 лет я нашел решение, ну ... не решение, но теперь я знаю, почему оно не сработало, или почему оно никогда не сработает. Кажется, есть ошибка в библиотеке CDO: она может обрабатывать команду STARTTLS на порту 25, но не может на порту 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» или сторонние компоненты.

person Paolo Branzaglia    schedule 18.09.2019