django send_mail() 函数需要几分钟
django send_mail() function taking several minutes
我正在尝试在我的 views.py 文件中的一个函数中发送电子邮件。我已经按照与此处相同的方式在我的设置文件中设置了电子邮件。
Python Django Gmail SMTP setup
电子邮件发送确实有效,但我的用户一直在抱怨这需要几分钟时间。我在 var/log/mail.log 文件中收到 gethostbyaddress 错误,我将在此处 post。我曾经收到 nginx 超时错误,但将 "proxy_read_timeout 150;" 放入我的 /etc/nginx/sites-enabled/django 文件中。
这解决了与网站交互时的超时错误,但电子邮件仍需要几分钟才能加载。我正在使用 digitalocean django 液滴,我所有的液滴都出现了这种缓慢的速度。
这是我的视图函数
@login_required
def AnnouncementPostView(request, leaguepk):
league = League.objects.get(pk=leaguepk)
lblog = league.blog
if request.method == 'POST':
form = AnnouncementPostForm(request.POST)
if form.is_valid():
posttext = request.POST['text']
newAnnouncement = Announcement(text=posttext, poster=request.user)
newAnnouncement.save()
lblog.announce.add(newAnnouncement)
titleText = "%s Announcement" % (league.name)
send_mail(titleText, posttext, settings.EMAIL_HOST_USER, ['mytestemail@gmail.com'], fail_silently=False)
return HttpResponseRedirect(reverse('league-view', args=[league.pk]))
else:
form = AnnouncementPostForm()
return render(request, 'simposting/announcementpost.html', {'form': form, 'league': league})
这奏效了,公告被 post 编辑到所需的页面,甚至通过电子邮件发送,这只是一个时间问题,人们已经开始期待近乎即时的电子邮件发送过程,这使得 2-3 分钟的时间变得不可接受,尤其是注册的时候也会导致2-3分钟的等待。
一个问题可能是在尝试与 DigitalOcean 支持团队一起解决此问题时,我将我的 Droplet 名称和主机名更改为我设置的域。
我当前的主机名和 Droplet 名称是 mydomain.com。我在我的 /etc/hostname 文件中以这种方式设置。我的 /etc/hosts 文件看起来像这样
127.0.0.1 localhost.localdomain localhost mydomain.com
127.0.1.1 mydomain.com
每当我尝试发送邮件时,我的 var/log/mail.log 文件都会响应此消息
Oct 6 16:13:24 "oldDropletName" sm-mta[13660]: gethostbyaddr(10.xxx.xx.x) failed: 1
Oct 6 16:13:24 "oldDropletName" sm-mta[13662]: starting daemon (8.14.4): SMTP+queueing@00:10:00
我希望这是足够的信息来提供帮助,它已经困扰了几个星期,通常我可以通过在此处查找资料或与支持团队合作来解决我的问题,但这让我们感到困惑。感谢您抽出宝贵时间提供帮助!
发送电子邮件是一项网络绑定任务,您不知道需要多长时间才能像您的情况一样完成。尽管您的网络中可能存在延迟,但最好以异步方式执行此类任务,这样您的主线程就空闲了。
我在我的一个项目中使用了以下代码。
utils.py
import threading
from django.core.mail import EmailMessage
class EmailThread(threading.Thread):
def __init__(self, subject, html_content, recipient_list, sender):
self.subject = subject
self.recipient_list = recipient_list
self.html_content = html_content
self.sender = sender
threading.Thread.__init__(self)
def run(self):
msg = EmailMessage(self.subject, self.html_content, self.sender, self.recipient_list)
msg.content_subtype = 'html'
msg.send()
def send_html_mail(subject, html_content, recipient_list, sender):
EmailThread(subject, html_content, recipient_list, sender).start()
只需在您的视图中调用 send_html_mail。
我不是特别熟悉 sendmail(我使用 postfix),但我怀疑这几乎肯定与 sendmail 相关,可能与 Django 无关。第二个日志条目有 "SMTP+queueing@00:10:00"。 this link 表示 sendmail 在启动时使用一个标志来确定处理邮件队列的频率。你可能想看看你的 init 或你的启动脚本所在的地方,看看 sendmail 是如何配置的。此外,如果您使用的是 Gmail,您确实无法控制它们的任何延迟,因此除了确定邮件服务器的配置外,您还需要检查日志以了解实际发生操作的时间,例如邮件 queued/sent。该行在您的日志中显示的时间是从执行视图时开始的吗?如果有,就在sendmail手里了。
我正在尝试在我的 views.py 文件中的一个函数中发送电子邮件。我已经按照与此处相同的方式在我的设置文件中设置了电子邮件。
Python Django Gmail SMTP setup
电子邮件发送确实有效,但我的用户一直在抱怨这需要几分钟时间。我在 var/log/mail.log 文件中收到 gethostbyaddress 错误,我将在此处 post。我曾经收到 nginx 超时错误,但将 "proxy_read_timeout 150;" 放入我的 /etc/nginx/sites-enabled/django 文件中。
这解决了与网站交互时的超时错误,但电子邮件仍需要几分钟才能加载。我正在使用 digitalocean django 液滴,我所有的液滴都出现了这种缓慢的速度。
这是我的视图函数
@login_required
def AnnouncementPostView(request, leaguepk):
league = League.objects.get(pk=leaguepk)
lblog = league.blog
if request.method == 'POST':
form = AnnouncementPostForm(request.POST)
if form.is_valid():
posttext = request.POST['text']
newAnnouncement = Announcement(text=posttext, poster=request.user)
newAnnouncement.save()
lblog.announce.add(newAnnouncement)
titleText = "%s Announcement" % (league.name)
send_mail(titleText, posttext, settings.EMAIL_HOST_USER, ['mytestemail@gmail.com'], fail_silently=False)
return HttpResponseRedirect(reverse('league-view', args=[league.pk]))
else:
form = AnnouncementPostForm()
return render(request, 'simposting/announcementpost.html', {'form': form, 'league': league})
这奏效了,公告被 post 编辑到所需的页面,甚至通过电子邮件发送,这只是一个时间问题,人们已经开始期待近乎即时的电子邮件发送过程,这使得 2-3 分钟的时间变得不可接受,尤其是注册的时候也会导致2-3分钟的等待。
一个问题可能是在尝试与 DigitalOcean 支持团队一起解决此问题时,我将我的 Droplet 名称和主机名更改为我设置的域。
我当前的主机名和 Droplet 名称是 mydomain.com。我在我的 /etc/hostname 文件中以这种方式设置。我的 /etc/hosts 文件看起来像这样
127.0.0.1 localhost.localdomain localhost mydomain.com
127.0.1.1 mydomain.com
每当我尝试发送邮件时,我的 var/log/mail.log 文件都会响应此消息
Oct 6 16:13:24 "oldDropletName" sm-mta[13660]: gethostbyaddr(10.xxx.xx.x) failed: 1
Oct 6 16:13:24 "oldDropletName" sm-mta[13662]: starting daemon (8.14.4): SMTP+queueing@00:10:00
我希望这是足够的信息来提供帮助,它已经困扰了几个星期,通常我可以通过在此处查找资料或与支持团队合作来解决我的问题,但这让我们感到困惑。感谢您抽出宝贵时间提供帮助!
发送电子邮件是一项网络绑定任务,您不知道需要多长时间才能像您的情况一样完成。尽管您的网络中可能存在延迟,但最好以异步方式执行此类任务,这样您的主线程就空闲了。
我在我的一个项目中使用了以下代码。
utils.py
import threading
from django.core.mail import EmailMessage
class EmailThread(threading.Thread):
def __init__(self, subject, html_content, recipient_list, sender):
self.subject = subject
self.recipient_list = recipient_list
self.html_content = html_content
self.sender = sender
threading.Thread.__init__(self)
def run(self):
msg = EmailMessage(self.subject, self.html_content, self.sender, self.recipient_list)
msg.content_subtype = 'html'
msg.send()
def send_html_mail(subject, html_content, recipient_list, sender):
EmailThread(subject, html_content, recipient_list, sender).start()
只需在您的视图中调用 send_html_mail。
我不是特别熟悉 sendmail(我使用 postfix),但我怀疑这几乎肯定与 sendmail 相关,可能与 Django 无关。第二个日志条目有 "SMTP+queueing@00:10:00"。 this link 表示 sendmail 在启动时使用一个标志来确定处理邮件队列的频率。你可能想看看你的 init 或你的启动脚本所在的地方,看看 sendmail 是如何配置的。此外,如果您使用的是 Gmail,您确实无法控制它们的任何延迟,因此除了确定邮件服务器的配置外,您还需要检查日志以了解实际发生操作的时间,例如邮件 queued/sent。该行在您的日志中显示的时间是从执行视图时开始的吗?如果有,就在sendmail手里了。