python - django send_mail() 函数需要几分钟

标签 python django email nginx sendmail

我正在尝试在我的 views.py 文件中的函数中发送电子邮件。我已经按照与此处相同的方式在我的设置文件中设置了电子邮件。

Python Django Gmail SMTP setup

电子邮件发送确实有效,但它需要几分钟才能发生,我的用户一直在提示。我在 var/log/mail.log 文件中收到 gethostbyaddress 错误,我将在此处发布。我曾经收到 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 液滴,我所有的液滴都出现了这种缓慢的速度。

这是我的 View 函数

@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 支持团队一起解决此问题时,我将我的 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

我希望这是足够的信息来提供帮助,这已经困扰了几周,通常我可以通过在此处查找资料或与支持团队合作来解决我的问题,但这让我们感到困惑。感谢您抽出宝贵时间提供帮助!

最佳答案

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

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

实用程序.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()

只需从您的 View 中调用 send_html_mail。

关于python - django send_mail() 函数需要几分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32979945/

相关文章:

HTML 电子邮件 - Outlook.com 正在将 CSS 样式从一个 DOM 元素移动到另一个

PHP 不向名称中包含 2 个点 ('.' ) 字符的电子邮件地址发送电子邮件

coldfusion - 对于 HTML 电子邮件,如何嵌入图像以便用户不会收到下载提示

python - 从 sqlite3 确定最大列数

python - 如何使用 python API 在 bigquery 中创建新 View ?

python - 为什么在导入 datetime 类后不能使用此引用?

javascript - Django jquery ajax 图片上传

python - 如何在没有 discord.py 的情况下获取用户在 discord 服务器中发送的消息数?

python - 如何编写动态Django模型?

Django 模板-递归使用 FilePathField 时如何输出文件的相对路径