2011-12-21 73 views
2

我的應用程序使用Indy TiDSMTP客戶端組件發送電子郵件。但是,在某些情況下,客戶無法或不願意設置SMTP服務器和端口,用戶名等,因此我想提供一種不需要任何人設置任何內容即可發送電子郵件的解決方案。在不使用外部服務器的情況下使用Indy發送郵件

我試過了TIDSMTPRelay演示,但我需要輸入DNS服務器IP地址(當我這樣做時,它失敗了「項目SMTPRelay.exe引發異常類EIdHostRequired帶有消息」)。我希望Indy解決方案不需要用戶輸入任何設置 - 只要他們可以訪問互聯網,即可「開箱即用」。

我還需要提供什麼?

TIA, [R

+3

請注意,如果某些檢查(例如MX記錄,反向DNS查詢,動態IP範圍等)失敗,則另一端的某些郵件服務器可能拒絕接收郵件。因此,最好通過郵件服務器「中繼」,郵件服務器將接受郵件並將它們轉發到目的地。 – 2011-12-21 19:05:28

+0

您的意思是,將我自己公司的電子郵件服務器和身份驗證詳細信息硬編碼到應用程序中,並使用TidSMTP(客戶端)發送郵件? – rossmcm 2011-12-21 19:58:14

+0

您可以從根服務器開始解析DNS,無需知道本地配置的DNS服務器IP地址。 – 2011-12-21 20:58:02

回答

10

您必須將電子郵件直接發送到收件人的郵件服務器。這需要執行DNS查找來爲每個收件人域檢索MX記錄。 Indy的TIdSMTPRelay組件可以爲您處理(通過在內部使用TIdDNSResolver組件)。

沒有平臺中立的方式來查詢機器當前的DNS配置。這需要平臺特定的API。 Indy目前沒有任何東西可以實現自動化,但我認爲它在未來版本中不會超出可能性範圍。

您看到的例外情況是由TIdTCPClient.Connect()引發的。使用TIdSMTPRelay時,您不應該手動調用該功能。它在確定要爲每個收件人域連接哪個Host後在內部調用。您只需要設置DNSServer屬性,可選地設置RelaySender屬性,然後調用Send()方法。沒有其他的。

+0

謝謝雷米。 [quote] TIdTCPClient.Connect()引發了這個異常。使用TIdSMTPRelay時,不應該手動調用它。它在確定爲每個收件人域連接哪個主機後在內部調用。您只需設置DNSServer屬性,可選擇設置RelaySender屬性,然後調用Send()方法。 [/ quote] 我正在運行'TidSMTPRelay'演示例子,我曾經假設我完成了所有這些工作,只要填寫完所有字段並單擊「發送」即可。我在這裏錯過了什麼? – rossmcm 2011-12-21 19:29:00

+0

那麼TIdSMTPRelay示例代碼錯了? – rossmcm 2011-12-21 21:33:43

+0

沒錯,只是老了。在'btnSendMailClick()'中,除去調用'Send()'的'Connect()'和'Disconnect()'兩個調用,只調用'Send()'。您可以在異常處理程序中移除對「Connected()」和「Disconnect()」的調用,因爲Send()在退出之前會在內部關閉套接字。除此之外,演示中的其他一切都很好。 – 2011-12-22 00:41:50

相關問題