Django send_mail()函数耗时几分钟



我试图在我的views.py文件中的函数中发送电子邮件。我已经在我的设置文件中设置了电子邮件,方法和这里一样。

Django Gmail SMTP设置

电子邮件发送工作,但它需要几分钟发生,我的用户一直在抱怨。我在var/log/mail.log文件中收到一个gethostbyaddress错误,我将在这里发布。我曾经得到nginx超时错误,但把"proxy_read_timeout 150;"到我的/etc/nginx/sites-enabled/django文件。

http://www.nginxtips.com/upstream——时间——110 -连接-时间- -时-阅读-反应-头-从upstream/

这解决了与网站交互时的超时错误,但电子邮件仍然需要几分钟才能加载。我使用的是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})

这已经起作用了,公告被发布到所需的页面,甚至通过电子邮件发送,这只是一个时间问题,人们已经开始期望几乎即时的电子邮件处理,这使得2-3分钟不可接受,特别是当注册也导致2-3分钟的等待。

一个问题可能是,当我试图与DigitalOcean支持团队解决这个问题时,我将我的液滴名称和主机名更改为我设置的域。

我当前的主机名和液滴名称是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不是特别熟悉(我使用后缀),但我怀疑这几乎肯定与sendmail有关,而可能与Django无关。第二个日志条目为"SMTP+queueing@00:10:00"。这个链接将表明sendmail在启动时接受一个标志,以确定处理邮件队列的频率。您可能希望查看init或启动脚本所在的位置,看看sendmail是如何配置的。此外,如果你使用Gmail,你真的无法控制任何延迟,所以除了确定邮件服务器的配置外,你还需要检查日志,看看什么时候实际发生了什么动作,比如邮件正在排队/发送。日志中显示的时间是从视图执行的时间开始的吗?

最新更新