You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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: 连接意外关闭

问题原因及修复方案

  1. 加密方式与端口不匹配:IONOS的465端口是SSL加密专属端口,需用smtplib.SMTP_SSL而非smtplib.SMTP(后者默认建立未加密连接,直接连465会导致中断)。
  2. 重复连接操作:初始化SMTP对象时已自动执行连接,无需手动调用server.connect()。
  3. 多余的加密升级指令:SMTP_SSL已建立SSL加密连接,starttls是用于将普通连接升级为加密连接的指令,在此场景下完全多余,甚至会引发错误。
  4. 格式字符串语法错误:原代码中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:09:59