2012-01-22 7 views
1

私は1000以上の電子メールをクライアントに送信するアプリを持っています。各電子メールはクライアントごとにカスタマイズされています。 Gmailビジネスアカウント(Google Appの支払い)を使ってメールを送信するDjangoアプリがあります。Django - たくさんの電子メールを送信する - SMTP接続を中止する

私が問題になっているのは、約80-100のメールがsuccessfulyに送信された後、GmailへのSMTP接続が切断されることです。私は再び送信を開始する前に約10〜15分待たなければなりません。しかし、約70〜100の電子メールが正しく送信された後も、接続は切断されます。

私はDjango-Mailer-2を使ってメールを送信します。私のDjangoアプリが生成するエラーは次のとおりです。

Traceback (most recent call last): 
    File "manage.py", line 11, in <module> 
    execute_manager(settings) 
    File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 438, in execute_manager 
    utility.execute() 
    File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 379, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 191, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 220, in execute 
    output = self.handle(*args, **options) 
    File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 351, in handle 
    return self.handle_noargs(**options) 
    File "/usr/local/lib/python2.6/dist-packages/django_mailer/management/commands/send_mail.py", line 47, in handle_noargs 
    send_all(block_size, backend=settings.USE_BACKEND) 
    File "/usr/local/lib/python2.6/dist-packages/django_mailer/engine.py", line 91, in send_all 
    blacklist=blacklist) 
    File "/usr/local/lib/python2.6/dist-packages/django_mailer/engine.py", line 179, in  send_queued_message 
    [message.to_address], smart_str(message.encoded_message)) 
    File "/usr/lib/python2.6/smtplib.py", line 697, in sendmail 
    self.rset() 
    File "/usr/lib/python2.6/smtplib.py", line 438, in rset 
    return self.docmd("rset") 
    File "/usr/lib/python2.6/smtplib.py", line 363, in docmd 
    return self.getreply() 
    File "/usr/lib/python2.6/smtplib.py", line 340, in getreply 
    raise SMTPServerDisconnected("Connection unexpectedly closed") 
smtplib.SMTPServerDisconnected: Connection unexpectedly closed 

最後の2行で、Gmailが接続を切断していると思います。私はGmailに挑戦してきた。彼らはそれが問題ではなく、私のソフトウェアであると主張する。

あなたはどう思いますか?その場合

+0

接続が切断されたときにGoogle MailサービスでTelnetセッションを試しましたか?コネクションの可能性を検証するだけです。 – Jingo

答えて

2

OK - この状況を解決しました。本当に、それは回避策の多くです。彼らはそれが迷惑メールだと思ってGmailが私のメールを止めていると思う。何百もの電子メールを次々に送信すると、最後に何かが誘発され、接続が切断されました。それはとにかく私の理論です。

私の回避策は、engine.pyファイルにコード行を追加することです。電子メールが正常に送信された後、私はtime.sleep(70)という行を追加しました。これによりメーラは70秒待ってから続行します。このコードを追加して、すべてのメールを送信しようとしました。約7時間後、400以上の電子メールが正常に送信されました。私はそれが動作すると言うでしょう。それは速くする必要はありません、それはちょうど動作する必要があります。送信されている限り、数日かかるかどうかは気にしません。

ありがとうございました。

0

、あなたが最も可能性が高いだけでいくつかのデバッグを行うことができますライン697の周り 「/usr/lib/python2.6/smtplib.py」には、次のようになります。

(code,resp) = self.mail(from_addr, esmtp_opts) 
    if code != 250: 
     self.rset() 
     raise SMTPSenderRefused(code, resp, from_addr) 

を私にそれへサーバーが接続をキャンセルすることでRSETコマンドを処理するように見えます。その場合は試してみることができます。手動で接続を処理し、rset()コマンドを発行する。

また、このコードはSMTPSenderRefused例外を発生させる前に呼び出されたようですので、この特定のメールは送信されません。

クイックフィックスは、RSETコマンドを無効にするには、モンキーパッチのようになります。

明らか
import smtplib 
smtplib.SMTP.rset = lambda self: 0 
+0

これは非常に良い考えではありません。サーバとの接続が拒否され、この猿のパッチ適用は効果がありません。 –

+0

まず、適切な例外を発生させることによって、最初にリセットの原因となったものについて、適切なフィードバックを与えます。よりスマートなパッチは 'smtplib.SMTP.rset = smtplib.SMTP.close'でもソケットを閉じることができ、即座に再接続することができます。 – rumpel

+0

@rumpel: 'smtplib.SMTP.close'に試して報告します。あなたは送信されていない電子メールについては正しいです。 Gmailのサポートに関する私の対話では、影響を受けるメールのヘッダーを要求し続けています。「メールは影響を受けず、接続はあります」と続けています。 – Garfonzo

0

、Google'd側のいくつかのレート制限があります。問題を議論してこのメ​​ールスレッドを見つけました:http://blogoscoped.com/forum/112956.html

+0

私は限界があることを知っています。有料サービス(Google Business Apps)の場合、制限は24時間あたり2,000件です。私はその限界に全くぶつからない。さらに、私が送る電子メールは一意であるため、「500人以上の受信者」は適用されません。 – Garfonzo

3

同じ問題が発生しました。私はあなたの解決策を取ったが、メールごとに寝る代わりに、10通のメールを送信してから70秒待つ。私はこのように200以上の電子メールを正常に送信することができました。私は50通のメールをスリープさせようと試みたが、まだ問題があり、接続が切断される前に100通しかメールが送信されなかった。

関連する問題