使用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
相关产品推荐
相关产品推荐

