2016-11-04 59 views
0

与vbSendMailSMTP超时与vbSendMail VB6

奇怪的问题,我保持VB6遗留应用程序。客户端需要一个新的功能来处理消息列表以发送电子邮件。该应用程序是一个没有用户界面的ActiveX exe文件。每隔几分钟就会调用一次来从Task Scheduler处理队列。它被设置为无人执行编译,因此不能有任何表单。它只有模块和类模块。

如果我从主模块运行vbSendMail它似乎工作正常。但是,我无法将vbSendMail.clsSendmail组件声明为With Events。如果我尝试使用消息“仅在对象模块中有效”执行此操作。所以,我只是声明如下:

Private poSendMail As vbSendMail.clsSendMail

这是所有罚款和代码工作,并尽可能我可以看到发出的邮件(当然,当我用我自己的地址,他们到达!)。但是,我无法获取状态,进度,发送成功以及最重要的SendFailed事件。所以我无法知道邮件是否成功发送。

我试图创建一个类模块,并从那里我可以实例vbSendMail.clsSendmail,可与事件声明如下:

Private WithEvents oMail As vbSendMail.clsSendMail 

这让我去接从Sendmail的事件(和代码肯定似乎确实如此)。但是,问题是,当以这种方式声明时(并且使用与主模块完全相同的代码),我无法建立到邮件服务器的连接。我得到一个状态的事件后,随后一段时间由SendFailed事件如下:

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

我不明白,为什么通过类模块配置,而不是一个标准模块代码时应该表现有什么不同。

有没有人知道为什么会发生这种情况,或者我可以如何解决问题,以便我可以从vbSendMail.clsSendMail获得邮件实际上已成功发送的肯定确认?

非常感谢任何人都可以提供的帮助。

回答

0

我很好奇,所以我从here下载了当前的vbSendMail。

您将获得源代码以及word文档和示例代码。

下面是这个问题 - 我假设创建了dll的vbSendMail项目包含一个窗体'frmSck.frm',它充当用作SMTP通信组件的winsock控件的容器。有窗体上的单个子定义为:

Private Sub WinSck_Error(...) 

我的假设(未测试)是无人参与的执行设置拒绝表单创建的某些方面,以便在创建Winsock控件,按照您的经验,但winsock_Error()子不会被触发 - 因此不会捕获错误事件。

隧道中有一些灯光,尽管在clsSendMail的Class_Initialize()子文件的源文件中提到了一个无形的选择。然而它也提到有未解决的部署问题,所以灯光可能是火车。

从上面的链接下载并尝试无形式的方法可能会有一些里程。

+0

非常感谢Vanquished Wombat。我还仔细查看了文档和源代码,认为在最后的手段中,我可能能够编写不同的代码。关于使用winSck控件的隐藏表单的同样想法也让我担心它会成为一个无人值守的应用程序。但奇怪的是,当在modMain中声明和使用vbSendMail时,它看起来工作正常(但是当以这种方式声明时你不能获取事件消息)。 – James

+0

我最终解决了这个问题,它似乎与任何时候存在多于一个的vbSendMail实例有关。我可以在类模块中声明vbSendMail With Events,并获取进度和成功/失败事件。然而,如果我有一个vbSendMail实例声明并存在于一个我认为具有全局作用域的标准模块中,那么这将停止工作。 – James

+0

更奇怪的是,如果我首先实例化vbSendMail的类级模块,然后实例化标准模块vbSendMail,那么来自标准模块实例化的事件会被类级实例化(有趣!)接收到。通过严格控制vbSendMail实例的实例化和销毁,并确保在任何时候只有其中一个存在,我似乎已经解决了这个问题。 – James