Python smtplib发邮件时input输入参数导致邮件头显示异常
问题原因
- 所有通过
input()交互获取的字符串、readlines()读取的收件人地址,默认会携带首尾空白、末尾换行符等不可见字符,这些字符被写入邮件头字段(发件人、收件人、主题)后,会破坏邮件头的标准结构,导致客户端解析字段异常 - 端口号通过
input()获取到的是字符串类型,而smtplib.SMTP的port参数要求传入整型,类型不匹配也会引发传输过程的异常,间接导致邮件字段显示错误 - 未对输入内容做合法性校验,非法格式的邮箱地址、包含控制字符的主题,都会导致邮件头解析失败
解决方法
- 所有输入获取的参数都调用
strip()方法清除首尾不可见字符,端口号显式转为整型:
import smtplib import getpass from email.message import EmailMessage fileMail = input("\nEnter the file : ").strip() sub = input("\nEnter email subject : ").strip() smtpServer = input("\nEnter smtp server address : ").strip() # 端口转整型 smtpPort = int(input("\nEnter smtp port number : ").strip()) myEmail = input("\n\nEnter your Email address : ").strip() myEmailPasswd = getpass.getpass() try: mailContent = input("\nEnter email content (Please enter the ^C to end) :") while 1: mailContent += "\n" + input(">") except KeyboardInterrupt: print("\n\n") with open(fileMail, "r") as f: for emailAddr in f.readlines(): # 清除收件人地址的换行与空白,过滤空行 emailAddr = emailAddr.strip() if not emailAddr: continue email = EmailMessage() email['from'] = myEmail email['to'] = emailAddr email['subject'] = sub email.set_content(mailContent) with smtplib.SMTP(host=smtpServer, port=smtpPort) as smtp: smtp.ehlo() smtp.starttls() smtp.login(myEmail, myEmailPasswd) smtp.send_message(email) print(f'\n[✔️]Email was sent => {emailAddr}')
- 如果主题包含中文或特殊符号,可显式指定编码避免乱码:
from email.header import Header email['subject'] = Header(sub, 'utf-8')
- 可增加简单的参数校验逻辑,比如用正则判断邮箱地址格式是否合法,避免无效参数传入。
内容的提问来源于stack exchange,提问作者Fsociety Jocker2
相关产品推荐
相关产品推荐

