0

我的开发机器(装有 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 中其余的放缓来自哪里?

4

1 回答 1

0

我已改用 Google 的公共 DNS 服务器(8.8.8.88.8.4.4),所有这些问题都消失了。不知何故,DNS 服务器是这个问题的核心。

我仍然想知道为什么 Python 的调用需要 30 秒来解析域名,而在终端中完成 DNS 解析需要 5 秒。

于 2013-05-07T17:06:48.827 回答