Странной проблемой с 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
, что письмо действительно отправлено успешно?
Большое спасибо за любую помощь, которую может предложить любой человек.
Большое спасибо Побежденный Вомбат. Я также внимательно ознакомился с документацией и исходным кодом, думая, что в крайнем случае я мог бы кодировать что-то другое. Такая же мысль о скрытой форме с помощью элемента управления winSck также поразила меня, возможно, это повлияло на то, что это приложение без присмотра. Но странно, что vbSendMail работал нормально, когда объявлялся и использовался в modMain (но, конечно, вы не можете получать сообщения о событиях, объявляемые таким образом). – James
В конечном итоге я решил проблему, и она, похоже, имела какое-то отношение к тому, что в любой момент времени существует несколько экземпляров vbSendMail. Я могу объявить vbSendMail With Events в модуле класса и забрать события прогресса и успеха/сбоя. Однако это перестает работать, если у меня есть экземпляр vbSendMail, объявленный и существующий в стандартном модуле, который, как я предполагаю, будет иметь глобальную область видимости. – James
Даже незнакомец, если я сначала создаю модуль уровня класса vbSendMail, а затем создаю экземпляр стандартного модуля vbSendMail, события, полученные от стандартного экземпляра модуля, получаются путем создания экземпляра класса (интересно!). Сохраняя строгий контроль над экземпляром и уничтожением экземпляров vbSendMail и убедившись, что только один из них существует в любой момент, я, кажется, решил проблему. – James