使用Python smtplib发送邮件时遭遇连接意外关闭错误
Python自动发送邮件报错:连接意外关闭
我想用Python自动发送邮件,以下是我的代码:
#send email import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText server = smtplib.SMTP('smtp.ionos.de', 465) try: name="Mein Name" #You need to fill the name here server.connect('smtp.ionos.de', 465) server.starttls() server.ehlo() server.login("info@test.de","Passwort") TOADDR = "test@web.de" FromADDR = "info@test.de" msg = MIMEMultipart('alternative') msg['Subject'] = "Testbetreff" msg['From'] = FromADDR msg['To'] = TOADDR #The below is email body html = """\ <html> <body> <p><span style="color: rgb(0,0,0);">Dear {0},</span></p> <p> your email body </p> <p>Kind Regards,<br /> Your name .... </p> </body> </html> """.format(name.split()[0]) msg.attach(MIMEText(html, 'html')) server.sendmail(FromADDR, TOADDR, msg.as_string()) except Exception as e: # Print any error messages to stdout print(e) finally: server.quit()
运行代码后出现如下错误:
回溯(最近的调用最后): 文件 “C:\Users\MeinName\Downloads\emailsendenTest3.py”, 第5行,<module> server = smtplib.SMTP('smtp.ionos.de', 465) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件 “C:\Program Files\Python312\Lib\smtplib.py”, 第255行,在__init__中 (code, msg) = self.connect(host, port) ^^^^^^^^^^^^^^^^^^^^^^^^ 文件 “C:\Program Files\Python312\Lib\smtplib.py”, 第343行,在connect中 (code, msg) = self.getreply() ^^^^^^^^^^^^^^^ 文件 “C:\Program Files\Python312\Lib\smtplib.py”, 第405行,在getreply中 raise SMTPServerDisconnected(“连接意外关闭”) smtplib.SMTPServerDisconnected: 连接意外关闭
问题原因及修复方案
- 加密方式与端口不匹配:IONOS的465端口是SSL加密专属端口,需用
smtplib.SMTP_SSL而非smtplib.SMTP(后者默认建立未加密连接,直接连465会导致中断)。 - 重复连接操作:初始化
SMTP对象时已自动执行连接,无需手动调用server.connect()。 - 多余的加密升级指令:
SMTP_SSL已建立SSL加密连接,starttls是用于将普通连接升级为加密连接的指令,在此场景下完全多余,甚至会引发错误。 - 格式字符串语法错误:原代码中HTML字符串结尾多了一个双引号,需修正为
""".format(...)。
修复后的代码:
#send email import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText try: name="Mein Name" # 在这里填写你的名字 # 使用SMTP_SSL连接SSL专属端口465 server = smtplib.SMTP_SSL('smtp.ionos.de', 465) server.ehlo() server.login("info@test.de","Passwort") # 替换为你的邮箱密码/应用密码 TOADDR = "test@web.de" FromADDR = "info@test.de" msg = MIMEMultipart('alternative') msg['Subject'] = "Testbetreff" msg['From'] = FromADDR msg['To'] = TOADDR # 邮件正文 html = """\ <html> <body> <p><span style="color: rgb(0,0,0);">Dear {0},</span></p> <p> your email body </p> <p>Kind Regards,<br /> Your name .... </p> </body> </html> """.format(name.split()[0]) msg.attach(MIMEText(html, 'html')) server.sendmail(FromADDR, TOADDR, msg.as_string()) print("邮件发送成功") except Exception as e: # 打印错误信息到控制台 print(e) finally: if 'server' in locals(): server.quit()
额外注意:
- 若IONOS邮箱开启了两步验证,需使用应用密码而非登录密码进行SMTP登录。
- 可通过
telnet smtp.ionos.de 465测试本地网络是否能正常访问该端口,排除网络拦截问题。
内容的提问来源于stack exchange,提问作者user23331193
相关产品推荐
相关产品推荐

