2011-05-24 78 views
5

只是想知道您是否有人遇到過這個問題。我在Google App Engine上玩弄Python郵件API,並創建了一個應用程序,通過POST接受消息正文和地址,在數據存儲中創建一個實體,然後每分鐘運行一次cron作業,抓取200個實體併發送刪除電子郵件,然後刪除實體。Google App引擎鎖定

我用1500封電子郵件進行了實驗,在數據存儲中創建了1500個實體,併發送了1500封電子郵件。然後我看看我的統計數據,並看到約。配額中使用了45,000個接收者,這怎麼可能?

所以我的問題是「收件人通過電子郵件」配額實際計算在哪一點?在我創建郵件對象的時候還是我實際上是send()呢?我希望獲得第二名,但配額似乎顯示出不同。我確實在cron和任務之間傳遞郵件對象,等等。有人對此有任何信息嗎?

謝謝。

更新:事實證明,我實際上發送了一個只有1500個隊列的45k電子郵件。看來,一個cron作業會一直運行,直到上一個作業完成並與相同的實體一起工作。因此,問題變爲「如何鎖定實體並確保在發送電子郵件之前沒有人選擇它們」?

再次感謝!

+1

您是如何檢查發送1500封電子郵件的?你確定所有200個實體在下次工作前都被髮送和刪除了嗎? – 2011-05-24 13:38:39

+0

@Grzegorz很好的問題,會發現。 – kovshenin 2011-05-25 07:50:25

回答

2

實例化一個電子郵件對象當然不會計入您的「收件人通過電子郵件發送」的配額。與其他App Engine服務一樣,您在觸發RPC時使用配額,即調用send()

如果您打算通過電子郵件發送1500個收件人,並且App Engine表示您通過電子郵件發送了45,000個郵件,那麼您的代碼有一個錯誤。

+0

我想過了,今天我會做一些實驗,看看我做錯了什麼,希望不會達到2000免費屏障;) – kovshenin 2011-05-25 08:11:53

+0

已發送更新,感謝您的回覆,問題已更改;) – kovshenin 2011-05-26 09:46:20

3

使用任務發送電子郵件。

創建一個任務,將一個鍵作爲參數,檢索該鍵的存儲實體,然後發送電子郵件。

當您的處理程序接收到正文和地址時,請按照現在的方式進行存儲,但隨後將任務排入發送並將數據存儲區對象的密鑰傳遞給該任務,以便知道要發送電子郵件的對象。

您可能會發現主體和地址足夠小,您可以將它們作爲參數傳遞給任務,並讓任務發送電子郵件,而無需直接在數據存儲中存儲任何內容。

這也有一個好處,就是如果你想限制在給定時間(配額)內發送的郵件數量,你可以用這個速率設置一個任務隊列。

+0

是,那就是要走的路。您可以在數據存儲區的模型中添加一些狀態字段,以設置電子郵件是否已排隊,因此,每當cron作業檢查要發送的新電子郵件時,您都不會排隊處理相同的電子郵件。 – 2011-05-26 16:07:20