smtplib.SMTP.sendmail引发异常,但它的str是(250,'ok')

时间:2017-11-07 09:24:14

标签: python exception sendmail smtplib

            try:
            if not self.check_smtp_connected("main", self.sender_addr):
                self.close("main", self.sender_addr)
                if not self.connect("main", self.sender_addr):
                    self.last_error = "req_id:%d,connect to %s main failed" % (mail_id, self.name)
                    raise Exception("req_id:%d,connect to %s main failed" % (mail_id, self.name))
            sender_addr = parseaddr(self.msg['From'])[1]
            recv_addr   = parseaddr(self.msg['To'])[1]
            self.smtp_conns[self.sender_addr].sendmail(self.msg['From'], self.msg['To'], self.msg.as_string())
        except Exception as e:
            glogger.warning("req_id:%d,send mail by %s failed, error: %s" % (mail_id, self.name, str(e)))
        else:
            sent_succ = True
            break

check_smtp_connected使用noop()[0]检查与smtp服务器的连接。

我第一次得到:   req_id:7066283,tx_smtp发送邮件失败,错误:超时

所以例外是超时然后我使用check_smtp_connected来检查连接,它已经坏了。

我第二次得到:   req_id:7066283,tx_smtp发送邮件失败,错误:(250,'确定')   所以例外是(250,'Ok')

我阅读了sendmail的源代码,但找不到会引发此​​异常的分支。

所以我很困惑。结果是我的邮箱收到两封邮件

1 个答案:

答案 0 :(得分:0)

我解决了这个问题,因为我设置了smtplib参数' timeout = 3'并且邮件太大了,所以我第一次得到"超时"。我想第一次得到第一次回复,因为我真的收到了两次这封邮件,但没有得到证实。我把超时设置得更大了,一切都还好!