Django send_mail()函数需要几分钟时间

2024-10-01 17:26:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着在我的视图.py文件。我在我的设置文件中设置电子邮件的方式与这里相同。在

Python Django Gmail SMTP setup

电子邮件发送确实有效,但它需要几分钟的时间,我的用户一直在抱怨。我在var/log中收到gethostbyaddress错误/邮件.log我会在这里发布的文件。我以前常常得到nginx超时错误,但是将“proxy_read_timeout 150;”放入/etc/nginx/sites enabled/django文件中。在

http://www.nginxtips.com/upstream-timed-out-110-connection-timed-out-while-reading-response-header-from-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支持团队解决这个问题时,我将我的水滴名称和主机名更改为我设置的域。在

我当前的主机名和水滴名是我的域名. 我在我的/etc/hostname文件中设置了它。我的/etc/hosts文件如下所示

^{pr2}$

我的变量/日志/邮件.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

我希望这是足够的信息,它已经困扰了几个星期,通常我可以通过在这里查找资料或与支持团队合作来解决我的问题,但这让我们很为难。感谢您抽出时间来帮忙!在


Tags: 文件formlog视图电子邮件request错误时间
2条回答

发送电子邮件是一项网络任务,你不知道它需要多长时间才能完成,就像你的情况一样。虽然您的网络中可能存在延迟,但最好以异步方式执行此类任务,这样您的主线程是空闲的。在

我在我的一个项目中使用以下代码。在

在实用工具.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+排队@00:10:00英寸。并且this link表示sendmail在启动时接受一个标志,以确定处理邮件队列的频率。您可能需要查看init或启动脚本所在的位置,看看sendmail是如何配置的。另外,如果你使用的是Gmail,你真的无法控制任何延迟,因此在决定邮件服务器的配置时,你需要检查日志,看看何时有动作发生,比如排队/发送的邮件。是从视图执行时开始在日志中显示的时间?如果是这样,它就在sendmail的手中。在

相关问题 更多 >

    热门问题