Продукт, над которым я работаю, использует компоненты 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
Тот факт, что ваш тестовый ящик отправляет 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 с вашим приложением. Кто знает. Пожалуйста, предоставьте эти детали.
Других решений пока нет …