2012-02-19 87 views
1

我正在寫一個使用套接字發送郵件的SMTP類,幾乎都有成功。問題在於隨機工作,有時需要很多時間才能發送電子郵件。使用套接字使用電子郵件發送電子郵件

我注意到一旦「。」被髮送,我應該得到的電子郵件被髮送的響應,而不是我得到的服務器正在關閉傳輸(當我發送「QUIT」命令相同的消息),然後電子郵件發送的消息。

因此,郵件到達混合出於某種原因...但只有最後兩個命令:「。」和「退出」。

任何人都可以幫我一把嗎?

上傳這裏:http://pastebin.com/9vweVpe7

PD:我知道,我可以用PHPMailer的或快速的,但我想自己做學習。

+0

我想在PHP中,「準系統」的方式是使用使用sendmail的mail()函數。我想你可以編寫自己的套接字的東西,但這似乎是重新創造了更多的輪子比合理 – Mala 2012-02-19 03:48:00

+0

張貼包跟蹤。 – Brad 2012-02-19 04:10:41

+0

@sein Hello Sein,我也想在此學習。你可以請發佈已解決的SMTP類嗎? – 2012-11-03 22:39:56

回答

3

有幾個錯誤,並在您實現邏輯漏洞,但站出來把我當作直接關係到你的問題最重要的是:

1)compile_message()洞。

2)發送郵件數據時誤用command()

一旦您發送了初始的DATA命令並收到回覆,之後發送的每一行電子郵件數據都不是它自己的命令,而是您將它們視爲它們。通過爲每一行電子郵件數據呼叫command(),您都期待着由於它們不存在而永遠不會到達的響應。對於每行電子郵件數據,請致電fwrite()而不是command()。不要致電command(),直到您準備好發送終止.命令(該命令(順便提一句,需要將其移出if not html塊之外)。

此外,發送電子郵件數據的個別行時,如果以句點開頭,則必須在前面加上一個額外的句點。這在RFC 2821 Section 4.5.2中描述。你的代碼根本沒有處理。如果您沒有正確地轉義您的電子郵件數據,您可能會不時地終止電子郵件,並且隨後的電子郵件行將被服務器解釋爲未知命令,並且會發送相應的錯誤響應。如果服務器接收到一堆未知命令,則會終止連接並非不合理。

+0

你是對的,至於新行中的點,我只是發送一行測試,首先我想在繼續處理更多數據之前先讓它工作。關於拒絕郵件的問題是,即使您還沒有發送任何命令,並且您將獲得服務器信息,然後您就可以開始通信,您需要在套接字連接完成後立即獲得答覆。 – 2012-02-19 17:31:42

+0

是的,服務器在發送第一條命令之前確實發送了初始問候語響應。該響應不僅告訴ypu您正在與SMTP服務器進行通信,還會提示它是否支持ESMTP(當認爲出錯時提供更全面的錯誤代碼 - 使用EHLO進行驗證)以及服務器是否準備好接受你的命令與否。 – 2012-02-19 18:57:11