Используя компоненты Indy, я получаю «соединение закрыто изящно» ошибки, но только на некоторых компьютерах

Продукт, над которым я работаю, использует компоненты Indy для отправки электронных писем. Разработано в RAD Studio XE4 (C ++). Я пытаюсь выяснить, почему это работает на некоторых компьютерах, но не на других. Конечно, это работает на моей коробке разработчика. В окне теста я получаю сообщение «Изящное соединение закрыто» или ошибка сокета 10054.

Обе машины загружают одни и те же файлы Indy. В моем устройстве dev работает Win 8.1, а в тестовом окне — Win 7, поэтому некоторые библиотеки Windows DLL имеют разные версии, но я сомневаюсь, что это проблема.

Я написал очень простое тестовое приложение, и оно демонстрирует то же поведение.

SMTP-сообщения на моем устройстве dev выглядят так:

S: 220 smtp.gmail.com ESMTP vf11sm8649345igb.20 - gsmtp
C: EHLO ks-sayers-v60
S: 250-smtp.gmail.com at your service, [64.132.205.66]
S: 250-SIZE 35882577
S: 250-8BITMIME
S: 250-STARTTLS
S: 250-ENHANCEDSTATUSCODES
S: 250-PIPELINING
S: 250-CHUNKING
S: 250 SMTPUTF8
C: STARTTLS
S: 220 2.0.0 Ready to start TLS
C: EHLO ks-sayers-v60
S: 250-smtp.gmail.com at your service, [64.132.205.66]
S: 250-SIZE 35882577
S: 250-8BITMIME
S: 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
S: 250-ENHANCEDSTATUSCODES
S: 250-PIPELINING
S: 250-CHUNKING
S: 250 SMTPUTF8

SMTP-сообщения в моем тестовом окне выглядят так:

S: 220 smtp.gmail.com ESMTP s19sm631546ign.4 - gsmtp
C: EHLO ks-dsatest-v41
S: 250-smtp.gmail.com at your service, [64.132.205.66]
S: 250-SIZE  35882577
S: 250-8BITMIME
S: 250-STARTTLS
S: 250-ENHANCEDSTATUSCODES
S: 250-PIPELINING
S: 250-CHUNKING
S: 250 SMTPUTF8
C: STARTTLS
S: 220 2.0.0 Ready to start TLS
C: QUIT

Я использую одного и того же пользователя Gmail и пароль в обоих тестах. Я не уверен, почему мое тестовое приложение отправляет сообщение QUIT в окне теста вместо EHLO.

Буду очень признателен за любую помощь или идеи, что посмотреть на что!

RAD Studio XE4

Indy 10.6.0.4975

ssleay32.dll / libeay32.dll являются v1.0.0g

Тестовый код:

void __fastcall TForm1::btnSendClick(TObject *Sender)
{
IdLogFile1->Active = true;

try
{
try
{
IdSMTP1->ConnectTimeout = 30000;
IdSMTP1->Username = edtFrom->Text;
IdSMTP1->Password = edtPassword->Text;
IdMessage1->Recipients->Clear();
IdMessage1->Recipients->Add();
IdMessage1->Recipients->Items[0]->Address = edtTo->Text;

IdSMTP1->Connect();
if (IdSMTP1->Connected())
{
IdSMTP1->Send(IdMessage1);
}
LogSmtpSettings();
}
catch (Exception & e)
{
LogSmtpSettings();
throw Exception(e.Message);
}
}
__finally
{
IdLogFile1->Active = false;
}
}

Вот свойства компонента TIdSMTP:

Indy Version:        10.6.0.4975
Host:                smtp.gmail.com
Port:                587
HELO Name:
Mail Agent:
IOHandler:           TIdSSLIOHandlerSocketOpenSSL
Connection Timeout:  30000
Read Timeout:        -1
Authentication Type: Default
Validate Auth Login: True
Username:            '[email protected]'
Use EHLO:            True
TLS:                 Explicit TLS
Use Nagle:           True
Use Pipelining:      True
Use VERP:            False
VERP Delimiters:     none
Intercept:           TIdLogFile
Intercept IsClient:  True
Supports TLS:        True
Last Command Result: Ready to start TLS

1

Решение

Тот факт, что ваш тестовый ящик отправляет QUIT Команда сразу после получения STARTTLS успешный ответ означает, что рукопожатие TLS терпит неудачу. TIdSMTP звонки Disconnect() сам по себе, а затем поднял исключение TLS в вашем коде, сказав, что рукопожатие не удалось.

Кроме того, вы используете более старую версию Indy 10. TIdSMTP был обновлен в середине 2014 года, чтобы больше не отправлять QUIT если рукопожатие TLS терпит неудачу. Вы говорите, что используете 10.6.0.4975, текущая версия (на момент написания этой статьи) — 10.6.2.5339.

Теперь о том, почему рукопожатие TLS терпит неудачу, можно только догадываться, так как вы не предоставили никаких сведений о настройке для диагностики этой проблемы. Может быть, вы не настроили TIdSMTP правильно для TLS. Возможно, у вас не установлены правильные библиотеки SSL / TLS с вашим приложением. Кто знает. Пожалуйста, предоставьте эти детали.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]