2016-11-04 67 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