1

Djangoがメールを送信する必要がある1000を超えるメールを含むcsvがあります。しかし、1000 を超えるレコードを含む csv ファイルをアップロードすると、以下のエラーが表示されました。

File "/user/Envs/project/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 112, in get_response
  response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/user/Envs/project/local/lib/python2.7/site-packages/django/contrib/admin/views/decorators.py", line 17, in _checklogin
  return view_func(request, *args, **kwargs)
File "/user/apps/project_webapp/appy/customadmin/views.py", line 1131, in send_monthly_email
  connection.send_messages(emails)
File "/user/apps/project_webapp/appy/mailer/backend.py", line 57, in send_messages
  sent = self._send(message)
File "/user/Envs/project/local/lib/python2.7/site-packages/django/core/mail/backends/smtp.py", line 110, in _send
  self.connection.sendmail(from_email, recipients, message.as_bytes())
File "/usr/lib/python2.7/smtplib.py", line 735, in sendmail
  raise SMTPRecipientsRefused(senderrs)

しかし、同じcsvファイルを10通のメールで実行すると、エラーなしで機能しました

以下は私のコードです

設定.py

EMAIL_BACKEND = "mailer.backend.DbBackend"
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.sendgrid.net' #'smtp.gmail.com'
EMAIL_HOST_USER = 'xxxxx'
EMAIL_HOST_PASSWORD = 'xxxxxx'
EMAIL_PORT = '587'
EMAIL_SUBJECT_PREFIX = 'xxxxxxxxx'
DEFAULT_FROM_EMAIL = 'some@example.com'

django が送信する前にデータベースに送信するメッセージを保存したいので、カスタム メール バックエンドを作成しました。

DbBackend.py

from django.core.mail.backends.smtp import EmailBackend
from mailer.models import Message
from django.conf import settings

class DbBackend(EmailBackend):
    def __init__(self, host=None, port=None, username=None, password=None,
                 use_tls=None, fail_silently=False, **kwargs):
        super(EmailBackend, self).__init__(fail_silently=fail_silently)
        self.host = host or settings.EMAIL_HOST
        self.port = port or settings.EMAIL_PORT
        if username is None:
            self.username = settings.EMAIL_HOST_USER
        else:
            self.username = username
        if password is None:
            self.password = settings.EMAIL_HOST_PASSWORD
        else:
            self.password = password
        if use_tls is None:
            self.use_tls = settings.EMAIL_USE_TLS
        else:
            self.use_tls = use_tls
        self.connection = None

        #By default Django has this self._lock variable active, we have to deactivate it in 
        #order to save the messages in our database, without deactivating the message objects
        #will be locked and django doesn't allow to save the locked objects  

        # self._lock = threading.RLock()

    def send_messages(self, email_messages):
        """
        Sends one or more EmailMessage objects and returns the number of email
        messages sent.
        """
        if not email_messages:
            return

        # Save the messages to your database
        for message in email_messages:
            msg = Message()
            msg.email = message
            msg.save()
        # with self._lock:
        new_conn_created = self.open()
        if not self.connection:
            # We failed silently on open().
            # Trying to send would be pointless.
            return
        num_sent = 0
        for message in email_messages:
            sent = self._send(message)
            if sent:
                num_sent += 1
        if new_conn_created:
            self.close()
        return num_sent

ビュー.py

from django.core import mail

def send_monthly_email(request):
    if request.method == "POST":
        form = MonthlyEmailForm(request.POST, request.FILES)
        if form.is_valid():
            subject = request.POST.get('subject')
            message = request.POST.get('message')
            from_email = 'orders@example.com'
            recipient_list = request.FILES.get('recipient_list')
            input_file = csv.DictReader(recipient_list)
            connection = mail.get_connection()
            emails = []
            for row in input_file:
                 recipient = row.get('%s Recipients' % state).strip()
                 email = mail.EmailMessage(subject, message, from_email, [recipient,])
                 email.content_subtype = "html"
                 emails.append(email)
            connection.open()
            connection.send_messages(emails)
            connection.close()
            return HttpResponseRedirect('/admin/')
        else:
            response = RequestContext(request, {"form": form})
            return render_to_response('customadmin/monthly_email_form.html', response)
   data = {.................}
   form = MonthlyEmailForm(initial=data)
   response = RequestContext(request, {"form": form})
   return render_to_response('customadmin/monthly_email_form.html', response)

したがって、上記のコードで1000通のメールにメッセージを送信しようとしたときに、前述のエラーが表示されていました.DBbackend.pyファイルにエラーがあると考えたため、設定EMAIL_BACKEND = "mailer.backend.DbBackend"EMAIL_BACKEND = django.core.mail.backends.smtp.EmailBackendデフォルトのdjangoに置き換えましたバックエンドと同じエラーを受け取っているにもかかわらず

私は多くの投稿でグーグルを持っていますが、この仕事を得ることができませんでした.誰でもこのエラーを解決できますか? 一度に1000個の電子メールIDに電子メールを送信しようとすると、なぜエラーがスローされたのですか? そして、なぜ10個の電子メールIDに正常に送信されたのですか?

前もって感謝します

4

1 に答える 1

0

as_string()の代わりに試してくださいas_bytes()

于 2014-10-08T23:04:25.800 に答える