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に正常に送信されたのですか?
前もって感謝します