相信大家也常常遇到要大量寄發電子報或 eDM 時,總是寄不完全,或是寄發失敗,因為一次寄發數百封至數千封的郵件,對一般主機來說,負荷是相當大的。 通常,一般市面上的虛擬主機廠商所提供的主機空間,都會做一定程度的郵件寄發流量限制。 所以,為了不在短時間內超過主機的流量限制,也確保程式的順利運作, 在這邊為大家介紹 將郵件分批寄送的處理方式 (以每次寄發 10 筆為例)。
首先在 ASP 網頁中,先加上下面三行,以確保程式正常運作: On Error Resume Next '如果發生錯誤暫時略過 Response.Buffer = true '啟用緩衝 Server.ScriptTimeOut = 10000 '延長程式超時時間 在收件者的資料表中 (這裡可能是會員或訂戶),加上一個欄位 "sent",用來記錄此收件者是否已寄發。 在系統第一次讀取這個頁面時,就要使所有收件者的 sent 為 "N",做法如下: '將全部user設定為 "未寄發" Set rs = GetMdb("mydb/user.mdb","UPDATE users SET sent = 'N' ") '儲存一個紀錄,表示已經做過這個動作,下次讀取此頁面時,不要再做 Session("isSet") = "yes" 在頁面中加上自動重新整理本頁的語法,讓此頁面可以不斷重複執行寄發動作,直到所有收件者都已寄發為止。 < meta http-equiv = "refresh" content = "10" > 接下來,讀取全部收件者的資料,開始做寄發動作: '讀取全部 sent 為 N 的收件者 Set rs = GetMdb("mydb/user.mdb","SELECT * FROM users WHERE sent = 'N' ") '建立 CDO.Message 線上郵寄物件 myMailServer = "msa.hinet.net" sch = "http://schemas.microsoft.com/cdo/configuration/" Set cdoConfig = Server.Createobject("CDO.Configuration") cdoConfig.Fields.Item(sch & "sendusing") = 2 cdoConfig.Fields.Item(sch & "smtpserver") = myMailServer cdoConfig.fields.update Set cdoMessage = Server.Createobject("CDO.Message") Set cdoMessage.Configuration = cdoConfig '使用迴圈執行大量寄發 (每次 10 筆) For i = 1 To 10 cdoMessage.From = "寄件人" cdoMessage.To = "收件人" cdoMessage.Subject = "eDM標題" cdoMessage.HTMLBody = "eDM內容" cdoMessage.Send If Err Then Response.Write "寄送失敗 - " & Err.Description End If '將 sent 更新為已寄發 rs("sent") = "Y" rs.Update urs.MoveNext If rs.EOF Then Exit For Next Set cdoMessage = Nothing Set cdoConfig = Nothing
以上,可以避免因為收件者過多而造成系統逾時的問題,改成小量多批寄發的方式。 如果有其他意見或補充,歡迎共同參予討論,並請不吝賜教 ^_^ |