解决: smtplib发送邮件报错smtplib.SMTPServerDisconnected: Connection unexpectedly closed

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()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值