mail.Send
コールを処理するGAEインスタンスとRPCサーバー間の通信中に期限が切れています。これは、GAEの内部問題、または(可能性が高い)タイムリーな方法でSMTPサーバーとの通信の失敗を示す可能性があります。
後者は、概念的には、URLFetch呼び出しの期限と非常によく似ています。ただし、URLFetchのカスタム期限を設定して、その問題を大幅に軽減することは可能です。
残念ながら、Mail APIの類推には文書化されていません。しかし、EmailMessage.send()
のパラメータとして、自分のmake_sync_call
メソッド(より寛大な締め切りを可能にする)を提供するという回避策があります。このようなメソッドを作成するには、GAE RPC呼び出しを行うために使用されるPythonのインターフェイスの内部を掘り下げて調べる必要があります。あなたはその結果のmake_sync_call
方法で表彰されますカスタム期限を供給するために使用することができ
from google.appengine.api import apiproxy_stub_map
from google.appengine.api.apiproxy_stub_map import APIProxyStubMap
class TimeoutAPIStub(object):
def __init__(self, service, deadline = 25):
self.service = service
self.deadline = deadline
def CreateRPC(self):
rpc = apiproxy_stub_map.CreateRPC(self.service)
rpc.deadline = self.deadline
return rpc
def create_MakeSyncCall(service, deadline = 25):
apsm = APIProxyStubMap()
apsm.RegisterStub(service, TimeoutAPIStub(service, deadline))
return apsm.MakeSyncCall
:次のように解決策は、私が働いてルックスを見つけるあなたが詳細をお知りになりたい場合は
msg = EmailMessage()
# ... prepare your email ...
msg.send(make_sync_call = create_MakeSyncCall('mail', deadline = 300))
GAE RPC呼び出しのカーテンの下で何が起こるか、私はNick Johnson's blog post about itを読むことを提案する。これは、同様の問題を解決するためにPythonのGAE RPCバインディングを使いたいと思っていれば良い出発点です。
これはそれです。基本的には、1回のハンドラ呼び出しで何千ものRCP呼び出しを作成しようとしています。これを回避するには、代わりに_one_タスクを作成します。そのタスクは、問題を(何千人もの人にメールして)小さなタスクに刻み込むことです。 –
mail.Send()への呼び出しをタスクキューにサブミットできませんでした。失敗した場合は自動的に再試行されますか? –