Python SMTP Client调用sendmail方法报缺少必填参数msg错误如何解决?
错误原因及修复方案
1. 核心报错的直接诱因
你调用sendmail的方式错误:sendmail是SMTP类的实例方法,不能直接用类名SMTP调用,要么通过已经建立连接的实例对象conn调用,要么手动传入实例作为第一个参数。你当前的写法相当于少传了第一个实例参数,参数位错位后系统识别不到符合要求的msg参数,就抛出了缺少必填参数的错误。
2. 其他需要修复的隐性错误
signin函数内变量名不匹配:你定义的账号密码变量是email、password,调用login方法时却用了不存在的变量adresa、lozinka,运行时会触发变量未定义报错。write_send_message函数内遍历字典的变量名错误:你遍历message的键时,使用了未定义的unos、poruka变量,同样会触发变量未定义报错。- 邮件格式不规范:你当前传入的
msg仅包含正文,From、To、Subject等邮件头没有拼入邮件内容字符串,会导致收件端无法识别主题、发件人等信息,甚至被判定为垃圾邮件。
3. 修复后的完整代码
from smtplib import SMTP # 全局配置统一管理 host = 'smtpserver.smtp.com' port = 587 email = 'example@example.com' password = 'password' target_email = 'example2@example.com' # 初始化连接 conn = SMTP(host, port) def signin(): conn.ehlo_or_helo_if_needed() conn.starttls() # 修正变量名,用已定义的账号密码登录 conn.login(email, password) def write_send_message(): # 拼接符合规范的邮件内容 msg_lines = [ f'From: {email}', f'To: {target_email}', 'Subject: Test message', '', # 邮件头和正文之间必须保留空行分隔 'Test message from Python interpeter' ] msg = '\r\n'.join(msg_lines) print('Sending the message...:') print(msg) # 用已经完成连接鉴权的conn实例调用sendmail,参数位对应正确 conn.sendmail(email, target_email, msg) # 发送完成后关闭连接 conn.quit() signin() write_send_message()
内容的提问来源于stack exchange,提问作者user16915396
相关产品推荐
相关产品推荐

