smtplib发邮件经常报错:smtplib.SMTPServerDisconnected: Connection unexpectedly closed
server = smtplib.SMTP_SSL(mail_host)
server.connect(mail_host, 465)
server.login(mail_user, mail_pass)
这样有时可以, 但隔1小时就不行了, 百度后发现再加上下面这一句就可以了
server = smtplib.SMTP_SSL(mail_host, 465)
server.connect(mail_host, 465)
server.ehlo() # 若不加这行,在服务器环境会报错SMTPServerDisconnected("Connection unexpectedly closed")
server.login(mail_user, mail_pass)
但隔1小时又不行了, 去掉ehlo这句又可以了, 就是非常玄学
其实真正的原因是login()后没有调用quit(), 导致1个小时左右就被自动断开连接了
所以应该像下面这样写
def send_mail(subject: str, recv_email: str, msg: str):
'''同步 发邮件消息'''
ret = re.match(r"^([a-zA-Z0-9_]{4,20})@([a-zA-Z0-9\.]{2,5}){1,2}.com$", recv_email)
if not ret:
return
recv_name = ret.group(1)
message = MIMEText(msg, 'plain', 'utf-8')
message['From'] = "QAQ<{}>".format(mail_user) # 发件者信息
message['To'] = "{}<{}>".format(recv_name, recv_email) # 接收者信息
message['Subject'] = subject # 邮箱标题
# 登录发送者账号(发送前一定要登录)
server = smtplib.SMTP_SSL(mail_host)
server.connect(mail_host, 465)
server.login(mail_user, mail_pass)
# 发送邮件
server.sendmail(sender, [recv_email], message.as_string())
# 退出(发完后一定要退出, 不然一个小时左右之后会自动退出)
server.quit()