我的开发机器(装有 MacOS 10.8.3 的 MacBook Air)在发送电子邮件时遇到问题。这是痛苦的缓慢。但是,速度慢取决于我连接到互联网的方式。如果我使用家庭 WiFi 连接,发送电子邮件大约需要 30 秒。如果我以其他方式连接,例如在朋友家或通过我的 iPad 通过 LTE,电子邮件发送很快(< 1 秒)。
使用 Django debug_toolbar 我已将该getfqdn
函数确定为罪魁祸首。打开与 SMTP 服务器的连接时调用它:
Call CumTime Per TotTime Per Count
... SNIP ...
31.673 31.673 0.000 0.000 1
- /Users/<SNIP>/virtualenv/src/django/django/core/mail/message.py in send(249)
31.627 31.627 0.000 0.000 1
- /Users/<SNIP>/virtualenv/src/django/django/core/mail/backends/smtp.py in send_messages(80)
31.623 31.623 0.000 0.000 1
- /Users/<SNIP>/virtualenv/src/django/django/core/mail/backends/smtp.py in open(37)
30.821 30.821 0.000 0.000 1
- /Users/<SNIP>/virtualenv/src/django/django/core/mail/utils.py in get_fqdn(14)
30.147 30.147 0.000 0.000 1
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py in getfqdn(124)
30.147 30.147 0.000 0.000 1
我尝试使用完全限定域名smtp.sendgrid.net
或 IP 地址50.97.69.146
作为EMAIL_HOST
. 这两种情况都会导致getfqdn
花费约 30 秒。
看看问题是否没有降低,我尝试使用终端远程登录到 SMTP 端口。当我从终端远程登录时,如果我使用主机名大约需要 5 秒:
> time echo 'quit' | telnet smtp.sendgrid.net 587
Trying 75.126.83.211...
Connected to smtp.sendgrid.net.
Escape character is '^]'.
Connection closed by foreign host.
echo 'quit' 0.00s user 0.00s system 45% cpu 0.002 total
telnet smtp.sendgrid.net 587 0.02s user 0.01s system 0% cpu 5.197 total
如果我使用 IP 地址,则大约需要 250 毫秒:
> time echo 'quit' | telnet 50.97.69.146 587
Trying 50.97.69.146...
Connected to 50.97.69.146-static.reverse.softlayer.com.
Escape character is '^]'.
Connection closed by foreign host.
echo 'quit' 0.00s user 0.00s system 42% cpu 0.002 total
telnet 50.97.69.146 587 0.02s user 0.01s system 8% cpu 0.259 total
我知道部分问题(由终端实验证明)是由缓慢的 DNS 查找(约 5 秒)引起的。Django/Python 中其余的放缓来自哪里?