我正在通过Python向我们的客户发送邮件,但最近我在我们的生产环境中收到了一些错误消息:
intranet-worker | mksp-worker 2021-07-30 07:49:39,693 INFO mails.py:setup_mailserver Logging in to mail server "smtp.strato.de"
intranet-worker | 07:49:39: 0.01s ! d8730ffa0ce644de9d5595cbe13290c8:send_welcome_mail failed, gaierror: [Errno -2] Name or service not known
intranet-worker | Traceback (most recent call last):
intranet-worker | File "/usr/local/lib/python3.8/site-packages/arq/worker.py", line 525, in run_job
intranet-worker | result = await task
intranet-worker | File "/app/tasks/mails.py", line 106, in send_welcome_mail
intranet-worker | return await send_mail_to(user.email, tpl, values)
intranet-worker | File "/app/tasks/mails.py", line 50, in send_mail_to
intranet-worker | mail_server = await setup_mailserver()
intranet-worker | File "/app/tasks/mails.py", line 20, in setup_mailserver
intranet-worker | mail_server = smtplib.SMTP_SSL(settings.smtp_server, settings.smtp_port)
intranet-worker | File "/usr/local/lib/python3.8/smtplib.py", line 1034, in __init__
intranet-worker | SMTP.__init__(self, host, port, local_hostname, timeout,
intranet-worker | File "/usr/local/lib/python3.8/smtplib.py", line 253, in __init__
intranet-worker | (code, msg) = self.connect(host, port)
intranet-worker | File "/usr/local/lib/python3.8/smtplib.py", line 339, in connect
intranet-worker | self.sock = self._get_socket(host, port, self.timeout)
intranet-worker | File "/usr/local/lib/python3.8/smtplib.py", line 1040, in _get_socket
intranet-worker | new_socket = socket.create_connection((host, port), timeout,
intranet-worker | File "/usr/local/lib/python3.8/socket.py", line 787, in create_connection
intranet-worker | for res in getaddrinfo(host, port, 0, SOCK_STREAM):
intranet-worker | File "/usr/local/lib/python3.8/socket.py", line 918, in getaddrinfo
intranet-worker | for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
intranet-worker | socket.gaierror: [Errno -2] Name or service not known代码就像这样简单:
async def setup_mailserver():
log.info('Logging in to mail server %s' % settings.smtp_server)
log.debug('Going to use username %s for authentication' % settings.smtp_username)
try:
mail_server = smtplib.SMTP_SSL(settings.smtp_server, settings.smtp_port)
mail_server.login(settings.smtp_username, settings.smtp_password)
return mail_server值settings.smtp_server为smtp.strato.de,错误消息正上方的日志记录输出证明了这一点。有趣的是:在本地运行它,它工作得很好。在我们的dev和stage集群中运行它,它工作得非常好。此错误仅在我们的生产环境中发生。主要区别在于dev和staging都运行在Azure Kubernetes上,而prod运行在普通的Linux服务器上,使用docker-compose。不过,它使用的是相同的图像。
当我在容器中得到一个bash时,我可以很高兴地解析并ping smtp.strato.de
[user@hostname docker]$ docker-compose exec intranet-worker bash
root@cef64049ef54:/app# ping smtp.strato.de
PING smtp.strato.de (81.169.145.133) 56(84) bytes of data.
64 bytes from smtp.strato.de (81.169.145.133): icmp_seq=1 ttl=246 time=20.1 ms
64 bytes from smtp.strato.de (81.169.145.133): icmp_seq=2 ttl=246 time=20.2 ms
^C
--- smtp.strato.de ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 3ms
rtt min/avg/max/mdev = 20.113/20.169/20.226/0.152 ms在同一个容器中的同一个应用程序中,我也在向外部API发出请求,这些API也是DNS解析的,它们工作得很好。我完全不知道是什么导致了这个错误,我非常感谢大家的支持。谢谢!
发布于 2021-07-30 09:16:49
在此日志行中有一个小提示:
intranet-worker | mksp-worker 2021-07-30 07:49:39,693 INFO mails.py:setup_mailserver Logging in to mail server "smtp.strato.de"特别要注意"smtp.strato.de",它包含引号。实际上,我在docker-compose.yml文件中的SMTP值两边有引号,如下所示:
- SMTP_SERVER="smtp.strato.de"删除引号可以使代码按预期工作。
https://stackoverflow.com/questions/68587371
复制相似问题