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

使用smtplib发送带主题邮件触发SMTPSenderRefused(555)错误求助

问题原因与解决方案

错误根源

你遇到的SMTP SenderRefused (555)错误,核心是**smtplib.SMTP.sendmail的参数使用错误**。这个方法的第三个参数必须是完整的邮件文本(包含邮件头和正文),而不是把主题、内容分开传递。你现在的写法会让SMTP服务器收到格式完全不符合规范的邮件内容,触发语法错误。

另外代码里还有个小语法错误:server.login("email@email.com", "Email_PW"])多了一个闭合方括号,需要去掉。

正确发送带主题的邮件

不需要去掉主题,只要按照SMTP规范构造完整的邮件内容即可,下面是两种可行的实现方式:

方式1:手动构造邮件内容(简单直接)

直接拼接符合邮件格式的字符串,包含From、To、Subject等头信息,正文与头信息用空行分隔:

@views.route('/thank-you', methods=['POST'])
def thank_you():
    subject = request.form.get("subject")
    first_name = request.form.get("first_name")
    last_name = request.form.get("last_name")
    email = request.form.get("email")
    message = request.form.get("message")

    response_message = "Thank you for contacting me."

    # 初始化SMTP服务器
    server = smtplib.SMTP("smtp.gmail.com", 587)
    server.starttls()
    server.login("email@email.com", "Email_PW")  # 修正多余的方括号

    # 构造给用户的回复邮件
    msg_to_user = f"""From: Your Name <email@email.com>
To: {first_name} <{email}>
Subject: {subject}

{response_message}
"""
    server.sendmail("email@email.com", email, msg_to_user)

    # 构造给自己的通知邮件
    msg_to_self = f"""From: {first_name} <{email}>
To: Your Name <email@email.com>
Subject: New Contact Form Submission - {subject}

First Name: {first_name}
Last Name: {last_name}
Sender Email: {email}
Message: {message}
"""
    server.sendmail("email@email.com", "email@email.com", msg_to_self)

    # 关闭连接(好习惯)
    server.quit()

    title = "Thank You"
    return render_template('thank_you.html', title=title, subject=subject, first_name=first_name, last_name=last_name, email=email, message=message)

方式2:使用email模块(更规范,支持复杂格式)

如果需要处理中文、特殊字符或者后续扩展HTML邮件,推荐用Python内置的email模块构造邮件,避免手动拼接的格式问题:

from email.mime.text import MIMEText
from email.header import Header

@views.route('/thank-you', methods=['POST'])
def thank_you():
    subject = request.form.get("subject")
    first_name = request.form.get("first_name")
    last_name = request.form.get("last_name")
    email = request.form.get("email")
    message = request.form.get("message")

    response_message = "Thank you for contacting me."

    server = smtplib.SMTP("smtp.gmail.com", 587)
    server.starttls()
    server.login("email@email.com", "Email_PW")

    # 构造给用户的邮件
    msg_user = MIMEText(response_message, 'plain', 'utf-8')
    msg_user['From'] = Header("Your Name <email@email.com>", 'utf-8')
    msg_user['To'] = Header(f"{first_name} <{email}>", 'utf-8')
    msg_user['Subject'] = Header(subject, 'utf-8')
    server.sendmail("email@email.com", email, msg_user.as_string())

    # 构造给自己的邮件
    self_content = f"""First Name: {first_name}
Last Name: {last_name}
Sender Email: {email}
Message: {message}"""
    msg_self = MIMEText(self_content, 'plain', 'utf-8')
    msg_self['From'] = Header(f"{first_name} <{email}>", 'utf-8')
    msg_self['To'] = Header("Your Name <email@email.com>", 'utf-8')
    msg_self['Subject'] = Header(f"New Contact Form Submission - {subject}", 'utf-8')
    server.sendmail("email@email.com", "email@email.com", msg_self.as_string())

    server.quit()

    title = "Thank You"
    return render_template('thank_you.html', title=title, subject=subject, first_name=first_name, last_name=last_name, email=email, message=message)

额外提示

你的HTML表单里的<select>标签写法有小问题,默认提示文本应该放在一个disabled selected的<option>里,否则部分浏览器会显示异常:

<select name="subject" id="subject">
    <option disabled selected>What is this message about?</option>
    <option value="Bible">Bible</option>
    <option value="Spiritual Things">Spiritual Things</option>
    <option value="Website">Website</option>
    <option value="Just to Talk">Just to talk</option>
    <option value="Other">Other</option>
</select>

内容的提问来源于stack exchange,提问作者Dustin916

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:25:20