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()
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐