2016-11-04 2 views
0

Странной проблемой с vbSendMailSMTP таймаут с vbSendMail VB6

Hi

Я сохранение унаследованного приложения в VB6. Клиенту требуется новая функция, которая предназначена для обработки списка сообщений для отправки электронных писем. Приложение представляет собой ActiveX exe, у которого нет пользовательского интерфейса. Он вызывается каждые несколько минут для обработки очереди из Планировщика заданий. Он настроен на компиляцию для автоматического выполнения и, следовательно, не может иметь никаких форм. Он имеет только модули и модули классов.

Если я запустил vbSendMail из модуля Main, он, похоже, работает нормально. Однако я не могу объявить vbSendMail.clsSendmail компонентом как With Events. Если я попытаюсь сделать эти объекты VB с сообщением «Only valid in object module». Так что я просто объявить его следующим образом:

Private poSendMail As vbSendMail.clsSendMail

Это все хорошо, и код работает, и, насколько я могу видеть, рассылает электронные письма (а они прибывают, когда я использую свой собственный адрес!). Тем не менее, я не могу получить статус, прогресс, SendSuccessful и, самое главное, события SendFailed. Поэтому у меня нет возможности узнать, успешно ли отправлено письмо или нет.

Я попытался создать модуль класса и оттуда я могу создать экземпляр vbSendMail.clsSendmail и может объявить его с событиями следующим образом:

Private WithEvents oMail As vbSendMail.clsSendMail 

Это позволяет мне, чтобы забрать события из SendMail (и код, конечно, похоже сделать OK). Однако проблема заключается в том, что при объявлении таким образом (и используя код, который читается точно так же, как и в основном модуле), я не могу установить соединение с почтовым сервером. Я получаю событие состояния последовало спустя некоторое время на SendFailed события следующим образом:

Send Status: Connecting to SMTP Server (mySMTPServerName)... 
Send Failed: Timeout occurred: The SMTP Host did not respond to the request 

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

Кто-нибудь знает, почему это происходит или как я могу решить проблему таким образом, чтобы получить положительное подтверждение от vbSendMail.clsSendMail, что письмо действительно отправлено успешно?

Большое спасибо за любую помощь, которую может предложить любой человек.

ответ

0

Мне было любопытно, поэтому я загрузил текущий vbSendMail с here.

Вы получаете источник плюс слово doc и пример кода.

Вот что - проект vbSendMail, из которого я предполагаю, создается dll, включает в себя форму 'frmSck.frm', которая выступает в качестве контейнера для элемента управления winsock, который используется в качестве компонента связи SMTP. Существует один к югу от формы определяется как:

Private Sub WinSck_Error(...) 

Мое предположение (не проверено) в том, что установка без присмотра исполнение отрицает некоторые аспекты создания формы, так что создается контроль Winsock, согласно вашему опыту, но что не активировано подмножество winsock_Error(), поэтому никаких ошибок не происходит.

В туннеле есть некоторый свет, поскольку в источнике для класса Class_Initialize() для clsSendMail упоминается, что существует бесформенная альтернатива.Однако в нем также упоминается, что есть нерешенные проблемы с развертыванием, поэтому свет - это поезд.

Возможно, существует некоторый пробег при загрузке по ссылке выше и попытка бесформенного подхода.

+0

Большое спасибо Побежденный Вомбат. Я также внимательно ознакомился с документацией и исходным кодом, думая, что в крайнем случае я мог бы кодировать что-то другое. Такая же мысль о скрытой форме с помощью элемента управления winSck также поразила меня, возможно, это повлияло на то, что это приложение без присмотра. Но странно, что vbSendMail работал нормально, когда объявлялся и использовался в modMain (но, конечно, вы не можете получать сообщения о событиях, объявляемые таким образом). – James

+0

В конечном итоге я решил проблему, и она, похоже, имела какое-то отношение к тому, что в любой момент времени существует несколько экземпляров vbSendMail. Я могу объявить vbSendMail With Events в модуле класса и забрать события прогресса и успеха/сбоя. Однако это перестает работать, если у меня есть экземпляр vbSendMail, объявленный и существующий в стандартном модуле, который, как я предполагаю, будет иметь глобальную область видимости. – James

+0

Даже незнакомец, если я сначала создаю модуль уровня класса vbSendMail, а затем создаю экземпляр стандартного модуля vbSendMail, события, полученные от стандартного экземпляра модуля, получаются путем создания экземпляра класса (интересно!). Сохраняя строгий контроль над экземпляром и уничтожением экземпляров vbSendMail и убедившись, что только один из них существует в любой момент, я, кажется, решил проблему. – James