发送REST服务器调试数据时收到空白邮件,求排查代码问题
问题排查与修复方案
嘿,我帮你找出代码里的问题了,这几个错误导致你收到空白且无主题的邮件:
1. 邮件发送时没用到你构建的msg对象
你在server.sendmail里直接传了str(loaded_r)或者原始body,但你之前构建的MIMEMultipart对象msg才是包含主题、发件人等头部信息的完整邮件体。直接传字符串的话,邮件服务器只会把它当成纯文本内容,完全忽略你设置的主题和头部,这就是为什么邮件没主题还空白的核心原因。
2. 错误地直接attach字典
msg.attach()方法需要接收MIME类型的对象(比如MIMEText),你直接把字典body传进去肯定不行,邮件系统根本不知道怎么处理这个类型的内容。
3. 其他潜在小问题
- Python 2里的
print虽然可以不加括号,但规范写法建议加上 server.sendmail的发件人参数硬编码成了error-report@do_not_reply.com,和你设置的msg['From']不一致,可能触发邮件服务器的校验机制- 如果初始化SMTP服务器失败,
finally块里调用server.quit()会抛出新的错误
修复后的完整代码
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import json # For testing def sendMail(usr, pwd, to, body): """ just for testing to send error via email """ fromaddr = usr toaddr = to msg = MIMEMultipart() msg['From'] = fromaddr msg['To'] = toaddr msg['Subject'] = "Data add request" # 把字典转成格式化的JSON字符串,再封装成纯文本MIME部件 formatted_body = json.dumps(body, indent=4) text_content = MIMEText(formatted_body, 'plain') msg.attach(text_content) server = None try: server = smtplib.SMTP('smtp.gmail.com', 587) server.ehlo() server.starttls() server.ehlo() server.login(usr, pwd) # 打印调试用的JSON内容 print("json: ", formatted_body) # 发送完整的邮件体(包含头部和正文) server.sendmail(fromaddr, toaddr, msg.as_string()) print("邮件发送成功!") except Exception, err: print('发送邮件出错: ', err) finally: if server is not None: server.quit()
核心修复点解释
- 用
MIMEText把JSON字符串包装成邮件能识别的正文格式,再attach到msg里 - 发送时用
msg.as_string(),这样邮件的主题、发件人、收件人以及正文都会被正确传递 - 统一发件人参数,避免和邮件头部信息冲突
- 增加服务器对象的判空,防止初始化失败时调用
quit()引发新错误
现在你再调用这个函数,应该就能收到带正确主题和完整JSON内容的邮件了。
内容的提问来源于stack exchange,提问作者Ciasto piekarz
相关产品推荐
相关产品推荐

