2011-11-01 58 views
1

我有一個PHP腳本,用戶發送郵件,如果他購買的是成功的。問題是由於郵件()導致頁面加載速度變慢。我知道有一些方法,比如將郵件放在數據庫表中,然後使用cron作業發送它們,但購買頻率很高,我希望郵件馬上發送,這樣看起來不像是一件好事選項。慢mail()函數變通方法

購買請求被通過從他那裏購買的,他只能做這麼一次在同一個頁面處理。除購買詳情外,用戶不控制任何郵件的任何部分。我想過使用Ajax,腳本會將數據發送到客戶端,然後調用一個ajax函數,然後調用另一個郵件腳本,但這會讓用戶知道正在發送的內容並可能被篡改。有沒有其他的方式可以安全地使用Ajax,而不讓用戶知道發送了什麼以及在哪裏?有沒有更好的解決方法?

+0

你在Windows機器上運行呢? – hafichuk

+0

是的Windows服務器2003 – vidit

+1

問題是,PHP需要連接到MTA,這可能導致緩慢。請參閱http://php.net/manual/en/function.mail.php上的'註釋'部分 – hafichuk

回答

0

你是正確的想法。這是我會在這種情況下做的:

  1. 用戶進行購買(沒有AJAX,除非你想在這一點上)
  2. 在處理該購買的電子郵件被插入到郵件表的「ID 「&」發送「列加上所有其他的東西。
  3. 用戶帶到一個成功頁面
  4. 成功頁面揭開序幕AJAX在後臺與來自DB該ID發送電子郵件 - 和負責不關心結果
  5. PHP頁面通過電子郵件發送電子郵件並標記發送的列

如果有人曾用未發送的ID撥打數據庫,那麼該電子郵件無論如何都需要發送出去,所以沒關係。如果標識不匹配或發送的列標記爲true,則可以忽略它。不用擔心人們試圖使用您的系統發送垃圾郵件。

4

郵件()應當在排隊的消息到您的郵件服務器,它(一般)應採取任何時候都立刻返回,所以我想在這裏你的問題肯定是郵件服務器,而不是你的PHP。我猜你正在提交的郵件服務器正在運行一些反垃圾郵件檢查,如反向DNS查詢。它也可能會根據使用情況對您進行限制。你可以嘗試通過另一個郵件服務器進行驗證嗎?

另外,如果你有shell訪問,請嘗試從外殼發送消息(例如,回聲測試|郵件-v -s測試[email protected]),看看它在做什麼以及需要多長時間。

編輯:剛纔注意到您的評論回覆:Windows操作系統。在這種情況下,至少您可以嘗試從PHP服務器到郵件主機的端口25的telnet,查看連接並獲取220問候標題需要多長時間。 (我敢打賭,你會立即連接,但不會得到220頭一會兒。)

+0

fyi,他使用的是Windows 2003 – hafichuk

+0

已註冊,已更新的答案。 –

+0

@AlexHowansky - 你是對的,它連接了,但花了一段時間的標題。所以唯一的選擇是使用外部SMTP服務器? – vidit