目前我一直在使用PHP和Zend Framework來發送與SMTP和Gmail的SMTP服務器的郵件太慢。這是因爲我有一個Google Apps域設置來處理我所有的電子郵件,所以看起來我的電子郵件來自[email protected]。在PHP發送電子郵件和使用谷歌Apps郵件的SMTP是
現在,當用戶註冊或做一些事情需要我的Web服務器發送電子郵件給他們這個可能需要5秒左右的時間在PHP端發起的SMTP連接,併發送電子郵件給他們。這一過程將是這樣的:
- 用戶完成註冊表格
- 用戶提交表單
- PHP腳本將信息保存到數據庫中,並將它們發送電子郵件(5-10秒)
- 用戶重定向到另一頁
現在,當他們剛剛提交表單時,我不能從我的Web服務器有一個巨大的延遲,而用戶坐在那裏10秒看起來像加載。基本上發送電子郵件的過程是單線程的,直到它完成發送是5-10秒,有時20秒是否有與電子郵件地址錯誤之間的任何電子郵件服務器不能做任何事情,所以這是太長了。
如何周圍的人這樣的問題通常會得到?
本來我試了幾件事情:
使用像SwiftMailer另一個庫。仍是同樣的問題。我認爲這是需要額外時間的SMTP/TLS握手。
將電子郵件數據存儲在數據庫中,然後使用fsockopen向另一個頁面發起異步請求,然後從另一個頁面獲取電子郵件數據併發送電子郵件。同時我的PHP腳本可以繼續同步,用戶將在表單提交後立即重定向到下一頁。問題在於無法確認電子郵件是否已發送,或者是否失敗。我可以在數據庫表上設置一個標誌,但我想提供即時反饋給用戶他們的電子郵件已發送。這意味着在下一頁上,在10秒後向另一個頁面發出Ajax請求,該頁面將檢查數據庫表上的標誌以查看它是否被髮送,然後在頁面上向用戶顯示響應。如果他們輸入了錯誤的電子郵件並且無法發送電子郵件,這將不起作用,因爲GMail的響應有時需要20秒才能發生錯誤,那麼數據庫標誌將不會被設置。
我想出的另一個選擇是將電子郵件數據放入$ _SESSION數組中,所以在提交頁面並且用戶位於重定向頁面之後,它會將ajax請求發送到另一個頁面,會話數據併發送電子郵件,然後將回復發送回用戶所在的頁面,並告訴他們電子郵件已發送。這工作得很好,但我覺得這可能不是最好的方法。
所以我想知道什麼是最好的做法呢?對於這種事情,GMail太慢了,因爲它必須進行TLS握手?我應該將所有電子郵件排入數據庫並每隔幾分鐘運行一次CRON作業發送它們,然後將它們從數據庫中刪除一次發送?問題在於沒有即時反饋給用戶他們的電子郵件已正確發送。或者我不需要爲此煩惱?他們要麼收到郵件,要麼沒有。
你的意思是用我的主機的電子郵件的SMTP服務器?我正在使用自己的VPS,所以我必須自己設置所有的權利? – zuallauz
是的,但並不難,速度也更快。 – 2013-01-05 23:50:51
@Dagon,你有什麼指南可以在Linux上設置它嗎?上次我看着它,我迷路了。這是否正確...我的Web服務器會發送電子郵件(也許使用PHP的send()方法)由我的郵件服務器在同一臺Web服務器上處理。該郵件服務器然後使用Google Apps SMTP將該電子郵件發送給用戶,還是使用其他一些我必須設置的電子郵件地址? – zuallauz